Acabei de ler este artigo e estou confuso.
Vamos imaginar 1 webapp e 1 aplicativo distinto atuando como "trabalhador", ambos compartilhando o mesmo banco de dados .
Ah, eu disse "compartilhar" .. mas sobre o que o artigo adverte? :
Em quarto lugar, compartilhar um banco de dados entre aplicativos (ou serviços) é uma coisa ruim. É muito tentador colocar um estado compartilhado amorfo lá e, antes que você perceba, você terá um monstro imenso.
=> discordo. Existem alguns casos em que aplicativos distintos ainda fazem parte da mesma unidade e, portanto, a noção de "problema de acoplamento" não faz sentido nesse caso.
Vamos continuar: o aplicativo da Web lida com solicitações HTTP do cliente e pode atualizar a qualquer momento alguns agregados (termo DDD), gerando os eventos de domínio correspondentes.
O objetivo do trabalhador seria manipular esses eventos de domínio processando os trabalhos necessários.
O ponto é:
Como os dados de eventos devem ser passados para o trabalhador?
A primeira solução, como o artigo lido promove, seria usar o RabbitMQ, sendo um ótimo middleware orientado a mensagens.
O fluxo de trabalho seria simples:
Sempre que o dinamômetro da web gera um evento, ele é publicado através do RabbitMQ, que alimenta o trabalhador.
A desvantagem seria que nada garante a consistência imediata entre a confirmação da atualização agregada e a publicação do evento, sem lidar com as possíveis falhas de envio ... ou problemas de hardware; essa é outra questão principal.
Exemplo: seria possível que um evento fosse publicado sem êxito da atualização agregada ... resultando em um evento representando uma representação falsa do modelo de domínio.
Você pode argumentar que o XA global (confirmação em duas fases) existe, mas não é uma solução que se adapta a todos os bancos de dados ou middlewares.
Então, o que poderia ser uma boa solução para garantir essa consistência imediata? :
IMO, armazenando o evento no banco de dados, na mesma transação local que a atualização agregada.
Um simples agendador assíncrono seria criado e responsável por consultar os eventos não publicados atuais do banco de dados e enviá-los ao RabbitMQ, que por sua vez preenche o trabalhador.
Mas por que precisar de um agendador extra no lado do aplicativo da Web e, a propósito: por que precisar do RabbitMQ nesse caso?
Por essa solução, parece logicamente que o RabbitMQ pode ser desnecessário, principalmente porque o banco de dados é compartilhado.
De fato, seja qual for o caso, vimos que a consistência imediata envolve uma pesquisa no banco de dados.
Assim, por que o trabalhador não seria responsável diretamente por essa pesquisa?
Portanto, pergunto-me por que tantos artigos na Web criticam dificilmente o enfileiramento de bancos de dados, enquanto promovem o middleware orientado a mensagens.
Trecho do artigo:
Simples, use a ferramenta certa para o trabalho: este cenário está implorando por um sistema de mensagens. Resolve todos os problemas descritos acima; sem mais pesquisas, entrega eficiente de mensagens, sem necessidade de limpar as mensagens concluídas das filas e sem estado compartilhado.
E consistência imediata, ignorada?
Em resumo, parece realmente que, seja qual for o caso, significando compartilhamento de banco de dados ou não, precisamos de pesquisa de banco de dados .
Perdi algumas noções críticas?
obrigado