Nel processo di utilizzo di RabbitMQ, alcuni scenari aziendali richiedono di garantire il consumo sequenziale. Ad esempio, in uno scenario in cui vengono generati tre messaggi per eseguire operazioni di aggiunta, modifica ed eliminazione di dati, se l'ordine di consumo non è garantito, la sequenza di esecuzione potrebbe diventare eliminazione, modifica, aggiunta, generando così disordine.
Come mostrato di seguito:
La questione del sequenziamento dei messaggi in RabbitMQ deve essere considerata in tre aspetti: l'ordine di invio dei messaggi, l'ordine dei messaggi nella coda e l'ordine del consumo dei messaggi.
Ordine di invio dei messaggi
L'ordine di trasmissione dei messaggi all'estremità del mittente del messaggio non è strettamente richiesto per la maggior parte delle attività aziendali. Non importa chi invia il messaggio per primo. Se un'attività richiede che i messaggi vengano inviati in ordine, significa che può essere inviato solo un messaggio alla volta con un blocco globale e i messaggi non possono essere inviati contemporaneamente.
Ordine dei messaggi nella coda
In RabbitMQ, i messaggi verranno infine memorizzati in una coda. All'interno della stessa coda, i messaggi sono ordinati in base al principio del primo arrivato, primo servito, che è garantito da RabbitMQ e di solito non ha bisogno di preoccupare gli sviluppatori.
Nota: L'ordine dei messaggi in code diverse non è garantito. Ad esempio, quando si entra in una stazione della metropolitana, se ci si unisce a una delle tre code, l'ordine di ingresso nella stazione non può essere garantito tra code diverse.
Ordine del consumo dei messaggi
Quando si discute su come garantire il sequenziamento dei messaggi, ci riferiamo generalmente all'ordine in cui i consumatori consumano i messaggi. Negli scenari in cui più consumatori consumano messaggi dalla stessa coda di messaggi, di solito non è possibile garantire il sequenziamento dei messaggi. Come indicato nel diagramma iniziale, anche se i messaggi nella coda dei messaggi sono ordinati, i consumatori multipli che consumano contemporaneamente i messaggi, la velocità con cui vengono recuperati i messaggi, la velocità di esecuzione della logica aziendale e possibili eccezioni di esecuzione possono portare a un sequenziamento inconsistente dei messaggi.
Ad esempio: i messaggi A, B e C entrano nella coda in sequenza. Il consumatore A1 riceve il messaggio A e il consumatore B1 riceve il messaggio B. Tuttavia, se il consumatore B1 esegue più rapidamente, potrebbe completare prima del consumatore A1, oppure se il consumatore A1 incontra un errore, entrambi i casi possono portare a un sequenziamento inconsistente dei messaggi.
La soluzione tipica al problema del consumo in sequenza è che una coda abbia un solo consumatore In questo modo, i messaggi possono essere elaborati uno per uno in ordine. Il lato negativo è che la capacità di concorrenza diminuisce e il consumo concorrente dei messaggi non è possibile. Si tratta di un compromesso.
Nota: Se l'azienda richiede il consumo sequenziale e un aumento della concorrenza, un approccio comune è abilitare più code. L'azienda può distribuire i messaggi a code diverse in base alle regole, aumentando così il livello di concorrenza. Ad esempio, in uno scenario di ordine di e-commerce, è necessario solo garantire il sequenziamento dei messaggi di ordine per lo stesso utente. I messaggi appartenenti a utenti diversi possono essere indirizzati a code diverse.