Vamos supor que queremos implementar um pequeno subsistema de segurança para um aplicativo financeiro que avise os usuários por email se um padrão estranho for detectado. Para este exemplo, o padrão consistirá em três transações como as representadas. O subsistema de segurança pode ler eventos do sistema principal de uma fila.
O que eu gostaria de receber é um alerta que é uma conseqüência direta dos eventos que acontecem no sistema, sem uma representação intermediária que modela o estado atual do padrão.
- Monitoramento ativado
- Transação processada
- Transação processada
- Transação processada
- Alerta acionado (id: 123)
- E-mail para alerta enviado (para o ID: 123)
- Transação processada
Tendo isso em mente, achei que a fonte de eventos poderia se aplicar aqui muito bem, embora eu tenha uma pergunta sem uma resposta clara. O alerta acionado no exemplo tem um efeito colateral claro, um email precisa ser enviado, uma circunstância que deve acontecer apenas uma vez. Portanto, isso não deve acontecer ao reproduzir todos os eventos de um agregado.
Até certo ponto, vejo o email que precisa ser enviado semelhante às materializações geradas pelo lado da consulta que eu já vi tantas vezes na literatura de fornecimento de CQRS / Event, mas com uma diferença não tão sutil.
Nesta literatura, o lado da consulta é construído a partir de manipuladores de eventos que podem gerar uma materialização do estado em um determinado ponto, lendo novamente todos os eventos. Nesse caso, porém, isso não pode ser realizado exatamente assim pelas razões explicadas anteriormente. A idéia de que todo estado é transitório não se aplica tão bem aqui . Precisamos registrar o fato de que um alerta foi enviado para algum lugar.
Uma solução fácil para mim seria ter uma tabela ou estrutura diferente, na qual você mantém registros dos alertas que foram acionados anteriormente. Como temos um ID, poderíamos verificar se um alerta com o mesmo ID foi emitido antes. Ter essas informações tornaria o SendAlertCommand idempotente. Vários comandos podem ser emitidos, mas o efeito colateral só ocorrerá uma vez.
Mesmo tendo essa solução em mente, não sei se é uma dica de que há algo errado com essa arquitetura para esse problema.
- Minha abordagem está correta?
- Existe algum lugar onde eu possa encontrar mais informações sobre isso?
É estranho que eu não tenha conseguido encontrar mais informações sobre isso. Talvez eu esteja usando o texto errado.
Muito obrigado!