Eu sou relativamente novo na arquitetura de microsserviços. Temos um aplicativo da Web de tamanho médio e estou avaliando os prós e os contras de dividi-lo em microsserviços, em vez de em um sistema monolítico que agora avançamos.
Pelo que entendi, considere microsserviços A
e B
cada um deles depende de um subconjunto de dados que o outro possui. Se uma mensagem for postada A
dizendo que algo mudou, você B
pode consumi-la e replicar uma cópia local das A
informações de e usá-la para fazer o que for B
necessário.
No entanto, o que se B
cai / falha e depois de um tempo, volta a aparecer novamente. Durante esse tempo de inatividade, A
publicou mais duas mensagens. Como B
saber como atualizar sua cópia local das A
informações de?
É verdade que, se B
é o único consumidor da A
fila, ele pode começar a lê-lo quando voltar a ficar on-line, mas e se houver outros consumidores dessa fila e essas mensagens forem consumidas?
Como um exemplo mais concreto, se um Users
serviço tiver seu endereço de email atualizado enquanto um Billing
microsserviço estiver inativo, se o Billing
microsserviço voltar a funcionar novamente, como saberá que o email foi atualizado?
Quando os microsserviços retornam, ele faz uma transmissão dizendo "Ei, estou de volta, me dê todas as suas informações atuais?"
Em geral, quais seriam as melhores práticas do setor para sincronização de dados?
fonte
Orders
precisa saber alguma coisaUsers
?Respostas:
Depois de fazer um pouco mais de pesquisa, deparei-me com este artigo, do qual retirei algumas citações que considero úteis para o que quero realizar (e para futuros leitores). Isso oferece uma maneira de adotar um modelo de programação reativa sobre um modelo de programação imperativo.
Origem do evento
O que isso ajuda a realizar é que, se um microsserviço ficar inativo, ainda que outros eventos pertinentes a ele estejam sendo publicados e os eventos sejam consumidos por, digamos, outras instâncias desse microsserviço, quando o microsserviço voltar, ele poderá se referir a ele
event store
para recuperar todos os eventos que perdeu durante o período em que caiu.Apache Kafka como Agente de Eventos
Considere o uso do Apache Kafka, que pode armazenar e despachar milhares de eventos por segundo e possui mecanismos internos de replicação e tolerância a falhas. Possui um armazenamento persistente de eventos que podem ser armazenados no disco indefinidamente e consumidos a qualquer momento (mas não removidos) do Tópico (fila de fantasia de Kafka) em que foram entregues.
De fato, quando os consumidores se identificam com a Kafka, a Kafka registra quais mensagens foram entregues a cada consumidor para que não sejam atendidas novamente.
Sagas
É quando a saga entra em cena. Uma saga é uma sequência de transações locais. Cada transação local atualiza o banco de dados e publica uma mensagem ou evento para acionar a próxima transação local na saga. Se uma transação local falhar porque viola uma regra de negócios, a saga executa uma série de transações compensatórias que desfazem as alterações feitas pelas transações locais anteriores. Leia isto para mais informações.
fonte
Eu desafiaria toda a sua idéia de "enviar os dados para todos os outros microsserviços".
Normalmente, se um serviço de cobrança precisar de um endereço de email, ele apenas solicitará o endereço do cliente específico. Ele não precisa manter uma cópia de todos os dados do endereço nem será informado se houver alguma alteração. Apenas pede e obtém a resposta dos dados mais recentes.
fonte
É possível substituir uma fila de eventos normal por um modelo de publicador / assinante, em que o
A
serviço publica uma nova mensagem do tópico T e oB
tipo de microsserviços se inscreveria no mesmo tópico.Idealmente,
B
seria um serviço sem estado e utilizaria um serviço de persistência desanexado, de modo que umaB
instância de serviço com falha fosse substituída por gerar uma ou maisB
instâncias de serviço para continuar seu trabalho, lendo no mesmo serviço de persistência compartilhado.fonte