Um sistema pode receber dois tipos de eventos:
# eventA
{
"correlationId": "123",
"eventType": "eventA"
}
# eventB
{
"correlationId": "123",
"eventType": "eventB"
}
O desafio é disparar um novo evento se, e somente se, os dois eventos forem recebidos.
- AWS SQS
- AWS DynamoDB
- AWS DynamoDB Stream
- AWS Lambda (nodejs)
- Terraform
- quando uma mensagem cair no SQS
app-events
, uma Lambdaapp-events-check
cadastrá esse evento no DynamoDBapp-events-registry
; - o DynamoDB possui um Stream habilitado que é processado pela Lambda
app-events-registry-stream
, que verifica quando eventos foram correlacionados/agregados com sucesso;- parte do filtro é feito com lambda event filtering. (Obrigado, Leandro Paixao e Carlos Decloedt, pela dica!)
- como os itens são gravados com TTL no Dynamo, a Lambda
app-events-registry-tt-stream
é responsável por tratar eventos incompletos (sem casamento) expirados pelo próprio DynamoDB;
- Utililitário para gerar eventos
- Lambda para receber eventos
- DynamoDB
- DynamoDB Stream
- Lambda para ler DynamoDB Stream
- Proteção contra concorrência (feito com Optimistic Locking + Retry + DLQ)