Z tego co opisujesz o kolejności to nasuwa mi się taki obraz:
Twój system stworzył 4 wiadomości i wysłał je do rabbita, lecz nie ma kto ich odebrać więc czekają sobie tak w kolejce.
wiadomości wyglądają następująco:
item1.update
itemXX.something
itemXY.something
item1.delete
Następnie uruchamiasz 4 konsumentów i każdy dostaję po 1 wiadomości w tym samym czasie( każdy dostał inną o to zadbał rabbit ), ale jak widać dla item1 następuje wyścig.
Mój pomysł rozwiązania problemu: (wymaga dodatkowych założeń)
item - zakładam że jest to coś
na czym trzeba wykonać daną operację -> np dane które pobieram z bazy
item - dodaje do coś'a pole które definiuje mi jego wersję, oraz dodaję ją w wiadomości w rabicie -> każda operacja na coś'u będzie podnosić jego wersje o 1
i teraz jako konsument sprawdzam czy wersja z wiadomości coś'ia jest równa z tego co pobieram z bazy, jeżeli tak to ją wykonuje, jeżeli nie to odczekuje jakiś czas (chodzi o to aby wiadomość nie robiła kółek z kolejki do konsumenta i z powrotem w czasie przetwarzania wiadomości z dobrą wersją przez innego konsumenta) i wysyłam ją ponownie, lub odsyłam ją jako NACK - zależnie czy wolę aby trafiła na koniec kolejki czy początek, jednak nie będzie to działać jeżeli nie jesteś w stanie zapewnić unikalności wersji dla każdej z zmiany dla item
i np do kolejki będą mogły trafić wiadomości item1.update
oraz item1.delete
z tą samą jego wersją.
Nie wiem czy wytłumaczyłem to w zrozumiały sposób, nie przychodzi mi też obecnie żaden inny pomysł do głowy
co do wysyłania tych maili to nie powinno być problemu tak długo jak po każdej wiadomości potwierdzasz jej przetworzenie przez ACK, oczywiście przypadek który opisał @some_ONE jest jak najbardziej możliwy, nie jestem stanie stwierdzić jak często może wystąpić bo dopiero u siebie wdrażamy rabbitamq, osobiście wykorzystuje springa i tam można ustawić ilość prób dostarczenia wiadomości oraz odstęp między nimi, ale takie rzeczy da się napisać i z palca w każdym języku.
Pamiętaj że rabbitamq da się ustawić oczywiście aby pracował w trybie mirror i mieć więcej instancji.
Zapomniałem dodać, w rabbicie można ustawić prefetch wiadomości czyli ilość wiadomości którą rezerwuje sobie dany konsument do przetworzenia, wtedy nikt też nie powinien ich podkraść, może pójście w tą stronę będzie w stanie rozwiązać twój problem z ich kolejnością.