Sto usando mongodb come servizio di coda per l'invio di e-mail. Presto funzionerà nel modo seguente:
- Quando arriva un nuovo messaggio lo memorizzo nel mongodb.
- Un lavoro in background carica quindi il messaggio da mongodb tramite l'operazione atomica findAndModify e imposta il flag
Processing
su true, quindi non elabora lo stesso messaggio due volte (perché il mio lavoro in background esegue più thread in parallelo). - Una volta inviata l'e-mail, rimuovo il documento da mongodb.
- Puoi anche tenere il conteggio degli errori per ogni messaggio e rimuoverlo dopo 3 tentativi falliti.
In generale utilizzo mongodb come servizio di coda solo per un motivo:perché ho bisogno di inviare e-mail secondo una pianificazione specificata (ogni messaggio contiene informazioni sull'ora in cui deve essere inviato).
Se non si dispone di alcuna pianificazione e è necessario elaborare il messaggio immediatamente, suggerisco di esaminare i servizi di coda esistenti, poiché probabilmente gestiscono tutti i casi che potresti non visualizzare senza una comprensione più approfondita delle code di messaggi.
Aggiorna
Quando il lavoro in background si arresta in modo anomalo durante l'elaborazione dei messaggi, puoi procedere come segue:
-
Sposta questo messaggio in un altro, raccolta di errori nella coda dei messaggi o...
-
Aumentare il contatore dei tentativi di elaborazione in un messaggio e assegnare nuovamente lo stato "Nuovo", per riprovare a elaborarlo. Assicurati solo che il lavoro in background sia idempotente (può elaborare lo stesso messaggio più volte e non danneggiare i dati) e transazionale (quando il lavoro fallisce è necessario annullare le modifiche apportate, se presenti). Quando il lavoro fallisce dopo 5 tentativi (valore di configurazione), eseguire #1.
-
Una volta risolto il bug con l'elaborazione dei messaggi, è possibile elaborarlo nuovamente assegnando lo stato "Nuovo" e spostandosi nella coda dei messaggi, o semplicemente eliminando questo messaggio. Dipende dai processi aziendali in realtà.