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?
Odpowiedz
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.
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
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. –
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 –
- 1. JMS AUTO_ACKNOWLEDGE po potwierdzeniu?
- 2. RabbitMQ wiadomości kolejek
- 3. Znaczek czasu przybycia wiadomości Rabbitmq
- 4. Jak ładować wiadomości w RabbitMQ
- 5. Rozmiar i typy wiadomości RabbitMQ
- 6. RabbitMQ 3.5 i Priorytet wiadomości
- 7. Wysyłanie wiadomości "w imieniu"
- 8. Nieznana aplikacja po potwierdzeniu zakupu w aplikacji
- 9. Wysyłanie wiadomości między komputerami
- 10. Wysyłanie wiadomości e-mail
- 11. Szyny link_to: Zrób coś po potwierdzeniu
- 12. Kolejka RabbitMQ peeking
- 13. Czy has_many wymaga belongs_to po drugiej stronie?
- 14. Sterownik RabbitMQ C# przestaje odbierać wiadomości
- 15. wysyłanie wiadomości z pliku wsadowego
- 16. RabbitMQ słucha tylko pierwszej wiadomości w kolejce
- 17. Dead letter exchange RabbitMQ upuszczanie wiadomości
- 18. Uzyskiwanie liczby wiadomości w kolejce RabbitMQ
- 19. Publikowanie wielu wiadomości do RabbitMQ z pliku
- 20. RabbitMQ - Uzyskaj całkowitą liczbę wiadomości zaksięgowanych
- 21. Wysyłanie wiadomości Firebase NoSuchMethodError.zzUr wyjątek
- 22. Wysyłanie wiadomości e-mail - MFMailComposeResult
- 23. Wysyłanie wiadomości do unikalnego gniazda
- 24. RabbitMQ - wybiórcze pobieranie wiadomości z kolejki
- 25. Zużywające nie potwierdzam wiadomości od RabbitMq
- 26. Dlaczego wywołanie zszywania protokołów OCSP jest wywoływane po potwierdzeniu oddzwonienia?
- 27. Jak przerwać wysyłanie wiadomości flash w szynach
- 28. Wysyłanie wiadomości między wątkami klas Python
- 29. Wysyłanie wiadomości e-mail przy użyciu C#
- 30. Wysyłanie wiadomości e-mail w formacie HTML
Dlaczego masz wielu producentów, gdy producent (P2) zawsze czeka na poprzedniego producenta (P1), aby uzyskać potwierdzenie? Jak komunikować się P1 i P2? – cantSleepNow