Estou usando o mongodb como serviço de fila para envio de e-mail. Em breve funcionará da seguinte maneira:
- Quando uma nova mensagem chega, eu a armazeno no mongodb.
- Um trabalho em segundo plano carrega a mensagem do mongodb por meio da operação atômica findAndModify e define o sinalizador
Processing
para true, portanto, ele não processa a mesma mensagem duas vezes (porque meu trabalho em segundo plano executa vários threads em paralelo). - Depois que o e-mail for enviado, removo o documento do mongodb.
- Você também pode manter a contagem das falhas de cada mensagem e removê-la após 3 tentativas com falha.
Em geral, uso o mongodb como serviço de fila apenas por um motivo:porque preciso enviar e-mails por agendamento especificado (cada mensagem contém informações sobre o horário em que deve ser enviada).
Se você não tiver nenhum agendamento e precisar processar a mensagem imediatamente, sugiro que examine os serviços de fila existentes, porque eles provavelmente lidam com todos os casos que você pode não ver sem uma compreensão mais profunda das filas de mensagens.
Atualizar
Quando o trabalho em segundo plano trava durante o processamento de mensagens, você pode fazer o seguinte:
-
Mova esta mensagem para outra coleção de erros da fila de mensagens ou ..
-
Aumente o contador de tentativas de processamento em uma mensagem e atribua novamente o status "Novo", para tentar processá-lo novamente. Apenas certifique-se de que o trabalho em segundo plano seja idempotente (pode processar a mesma mensagem várias vezes e não corromper os dados) e transacional (quando o trabalho falha, você deve desfazer as alterações feitas, se houver). Quando o trabalho falha após 5 tentativas (valor de configuração), execute #1.
-
Uma vez que o bug com o processamento de mensagens foi corrigido, você pode processá-lo novamente, atribuindo o status "Novo" e movendo para a fila de mensagens, ou simplesmente exclua esta mensagem. Depende dos processos de negócios, na verdade.