2016-02-28 7 views
5

Załóżmy, że kilku producentów publikuje na tej samej giełdzie E (fanout). Każdy producent ma swój własny kanał. Kolejka Q jest zobowiązana do wymiany E. producent P1 publikuje komunikat M1 do E i otrzymuje potwierdzenie A1 od E. Tylko po potwierdzeniu A1 drugi producent P2 publikuje drugi komunikat M2. Czy kolejność gwarancji RabbitMQ wiadomości w Q: M1 jest pierwsza, M2 jest druga? To będzie subskrybowany konsumentowi Q, zawsze otrzyma M1, a potem M2?Wysyłanie drugiej wiadomości po potwierdzeniu pierwszego. Czy RabbitMQ gwarantuje zamówienie?

+0

Dlaczego masz wielu producentów, gdy producent (P2) zawsze czeka na poprzedniego producenta (P1), aby uzyskać potwierdzenie? Jak komunikować się P1 i P2? – cantSleepNow

Odpowiedz

1

RabbitMQ gwarantuje kolejność wiadomości w kolejce: First In, First Out. Pierwsza wiadomość do kolejki będzie pierwszą wiadomością, która wyjdzie z kolejki i pozostaną w porządku (zakładając, że po prostu zużywasz i potwierdzasz je ... jeśli zaczniesz nackować/odrzucać wiadomość, ponownie je publikować itd., rzeczy się zmieniają)

Jest to jedyna gwarancja, że ​​zostanie wykonana na zamówienie wiadomości: Kolejki FIFO.

Jeśli chcesz zagwarantować, że wiadomości są dostarczane do kolejki, musisz sam ją zbudować.

FWIW, bardzo trudno jest zbudować tę gwarancję. Jedynym naprawdę gwarantowanym sposobem zapewnienia kolejności wiadomości nie jest wysyłanie następnego, dopóki pierwszy raz nie zostanie przetworzony.

Nawet jeśli czekasz na potwierdzenie wydawcy przed wysłaniem następnego, następna może znaleźć się w kolejce przed pierwszą (choć jest to mało prawdopodobne).

Możesz zajrzeć do Message Sequence i Resequencer, jeśli chcesz zagwarantować, że klient odbierze wiadomości w określonej kolejności.

+0

Dziękuję. Rozumiem, że odpowiadasz jako "Nie". Obaj zgadzamy się, że "pierwsza wiadomość, która trafi do ** kolejki **, będzie pierwszą wiadomością, która wyjdzie z kolejki". Ale moje pytanie dotyczy ** odległości między wymianą a kolejką **. A jeśli dobrze rozumiem, powiedziałeś, że wymiana może potwierdzić otrzymanie komunikatu M1 do P1, odebrać wiadomość M2 i umieścić ją w kolejce w odwrotnej kolejności: M2, a następnie M1. Poprawny? – Kaponir

+0

jest bardzo mało prawdopodobne, aby tak się stało, ale nadal możliwe. M1 może być bardzo duży i wymagać zapisu na dysk, na przykład, podczas gdy M2 jest bardzo mały i nie wymaga zapisywania na dysk. Lub proces erlang, który działa na M1, może ulec awarii i musi zostać uruchomiony ponownie, pozwalając M2, aby się tam dostać. Ponownie, mało prawdopodobne scenariusze, ale możliwe, nadal. –

+0

ostatecznie, jeśli potrzebujesz gwarantowanej kolejności przetwarzania, używaj sekwencera i ograniczaj przetwarzanie kolejki do 1 komunikatu na raz, aby móc poprawnie zmienić kolejność wiadomości, jeśli są one nieczynne –

Powiązane problemy