2016-02-28 8 views
5

Supponiamo che diversi produttori pubblichino allo stesso scambio E (fanout). Ogni produttore ha il proprio canale. La coda Q è destinata a scambiarsi E. Il produttore P1 pubblica il messaggio da M1 a E e riceve il riconoscimento A1 da E. Solo dopo aver riconosciuto A1 il secondo produttore P2 pubblica il secondo messaggio M2. RabbitMQ garantisce l'ordine dei messaggi in Q: M1 è il primo, M2 è il secondo? Cioè sarà abbonato al consumatore Q riceverai sempre M1 e dopo questo M2?Invio del secondo messaggio dopo il riconoscimento del primo. RabbitMQ garantisce l'ordine?

+0

Perché hai più produttori quando un produttore (P2) è sempre in attesa sul produttore precedente (P1) per ottenere ack? Come comunicano P1 e P2? – cantSleepNow

risposta

1

RabbitMQ garantisce l'ordine dei messaggi in una coda: First In, First Out. Il primo messaggio che entrerà in coda sarà il primo messaggio a uscire dalla coda, e rimarranno in ordine (presumendo che tu stia solo consumandoli e accettandoli ... se inizi a negare/rifiutare il messaggio, ri-pubblicandoli , ecc, le cose cambiano)

Questa è l'unica garanzia che farà sull'ordine dei messaggi: Code FIFO.

Se è necessario garantire l'ordine di recapito dei messaggi a una coda, è necessario creare tale processo autonomamente.

FWIW, è molto difficile creare questa garanzia. L'unico modo veramente garantito per garantire l'ordine dei messaggi non è quello di inviare quello successivo fino a dopo che il primo è stato elaborato.

Anche se si attende il riconoscimento del publisher prima di inviare il successivo, è possibile che il successivo finisca in coda prima del primo (anche se è altamente improbabile).

Si consiglia di esaminare Message Sequence e Resequencer se è necessario garantire che il client ottenga i messaggi in un determinato ordine.

+0

Grazie. Capisco che rispondi come "No". Siamo entrambi d'accordo sul fatto che "il primo messaggio di andare nella ** coda ** sarà il primo messaggio a uscire dalla coda". Ma la mia domanda riguarda la ** distanza tra lo scambio e la coda **. E se ho capito bene, hai detto che lo scambio può confermare l'ottenimento del messaggio da M1 a P1, ricevere il messaggio M2 e metterli in coda in ordine inverso: M2, quindi M1. Corretta? – Kaponir

+0

è altamente improbabile che ciò accada, ma è ancora possibile. M1 potrebbe essere molto grande e richiedere la scrittura su disco, ad esempio, mentre M2 è molto piccolo e non richiede la scrittura su disco. Oppure, il processo di erlang che sta lavorando su M1 potrebbe bloccarsi e dover riavviare, permettendo a M2 di arrivare prima. Di nuovo, non scenari probabili, ma possibili, ancora. –

+0

alla fine, se hai bisogno di un ordine di elaborazione garantito, devi usare un sequencer e limitare l'elaborazione di una coda a 1 messaggio alla volta in modo da poter riordinare correttamente i messaggi se sono fuori servizio –