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
A idéia aqui é representar a transição de estado de cada aplicativo na forma de um evento imutável. Os eventos são armazenados em um formato de log ou diário à medida que ocorrem (também chamados de 'armazenamento de eventos'). Eles também podem ser consultados e armazenados indefinidamente, com o objetivo de representar como o estado do aplicativo, como um todo, evoluiu ao longo do tempo.
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.
Os eventos são, então, atribuídos deslocamentos que os identificam univocamente no Tópico - Kafka pode gerenciar os deslocamentos, fornecendo facilmente semântica de entrega “no máximo uma vez” ou “pelo menos uma vez”, mas também pode ser negociada quando um consumidor de evento ingressa em um Tópico , permitindo que os microsserviços comecem a consumir eventos a partir de qualquer local arbitrário no tempo - geralmente de onde o consumidor parou. Se o último deslocamento de evento consumido for mantido transacionalmente no armazenamento local dos serviços quando os casos forem 'concluídos com êxito', esse deslocamento poderá ser facilmente usado para obter uma semântica de entrega de evento “exatamente uma vez”.
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
Para casos de uso mais complexos em que a comunicação entre diferentes serviços é realmente necessária, a responsabilidade de finalizar o processo deve ser bem reconhecida - o processo é descentralizado e termina quando todos os serviços envolvidos reconhecem sua tarefa como concluída com êxito, caso contrário, todo o processo deve falhar e medidas corretivas devem ser acionadas para reverter qualquer estado local inválido.
É 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.