Manipulação de eventos fora de ordem no lado de leitura do CQRS

Eu li este belo post de Jonathan Oliver sobre como lidar com eventos fora de ordem.

http://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/

A solução que usamos é desenfileirar uma mensagem e colocá-la em uma "mesa de espera" até que todas as mensagens com uma sequência anterior sejam recebidas. Quando todas as mensagens anteriores foram recebidas, retiramos todas as mensagens da tabela de espera e as executamos em sequência através dos manipuladores apropriados. Depois que todos os manipuladores foram executados com êxito, removemos as mensagens da tabela de espera e confirmamos as atualizações nos modelos de leitura.

Isso funciona para nós porque o domínio publica eventos e os marca com o número de sequência apropriado. Sem isso, a solução abaixo seria muito mais difícil - se não impossível.

Esta solução está usando um banco de dados relacional como mecanismo de armazenamento persistente, mas não estamos usando nenhum dos aspectos relacionais do mecanismo de armazenamento. Ao mesmo tempo, há uma ressalva em tudo isso. Se as mensagens 2, 3 e 4 chegarem, mas a mensagem 1 nunca chegar, não aplicamos nenhuma delas. O cenário só deve ocorrer se houver uma mensagem de erro no processamento 1 ou se a mensagem 1 for perdida de alguma forma. Felizmente, é fácil o suficiente para corrigir erros em nossos manipuladores de mensagens e executar novamente as mensagens. Ou, no caso de uma mensagem perdida, para recriar os modelos de leitura diretamente do armazenamento de eventos.

Tem algumas perguntas, particularmente sobre como ele diz que sempre podemos pedir à loja de eventos eventos ausentes.

O lado de gravação do CQRS precisa expor um serviço para o lado de leitura para "exigir" a repetição de eventos? Por exemplo, se o evento 1 não tiver sido recebido, mas tivermos 2, 4, 3, podemos solicitar ao eventstore por meio de um serviço para republicar eventos novamente a partir de 1?Esse serviço é de responsabilidade do lado de gravação do CQRS?Como reconstruímos o modelo de leitura usando isso?

questionAnswers(3)

yourAnswerToTheQuestion