[RabbitMQ] - jak zapobiec karmienia jednego consumera po restarcie.

0

Czesc, mam taka sytuację: Padaja mi wszystkie (lub sam je restaruje) workery i w tym czasie do producera nalecialo kilka eventow, ponownie wlaczam workery i wszystko leci do pierwszego, a chcialbym zaczekac np. az zaladuje sie 5. Przyklad troche wyimagowany, bo jesli ktorys worker jest zajety to tamten zdazy wstac, ale zdarza się sytacja, ze worker robi robote bardzo szybko i przez to wszystko leci do niego. Czy moge zapobiec takiej sytuacji?

Pozdrawiam

0

@error91:
Dopiero raczkuje w rabbitmq, ale z tego co rozumiem, nie rozwiaze to mojego problemu. Owszem, jeden worker dostanie jedna prace, ale w moim przypadku wyglada to nastepujaco. Startuje 5 workerow przez skypt x.sh, wstaje jeden worker i w tym czasie dostaje on jakas robote i zrobi ja tak szybko ze ciagnie kolejne zanim wstana te kolejne z tego skryptu. Co w wynikiem jest to, ze 1 worker zrobil wszystkie joby,a tamte dopiero wstaly.

Chodzi mi o mechanizm, ktory consumer nie bedzie nic konsumowal, dopki np. nie powstanie "5" workerow. Jesli powstanie 5 worker, dopiero wtedy otwieraja sie na konsumowanie.

0

Czyli upraszajac: Po petli od 1 do 5 stworz workery, zastopuj konsumpcje do kazdego workera 1-4, a jesli jestes ostatnim workerem, otworz konsumpcje dla pozostalych 4.

0

Hmm a po co ? Mógłbyś zdefiniować co to znaczy ze worker wstal? Czy workery sa na roznych maszynach ?

0

Bo chce zeby moje wiadomosci wychodzily "sprawiedliwe" ze zrodla. Biznesowo z mojego punktu widzenia, sprawiedliwie podczas restartu bedzie poczekanie az wstanie okreslona liczba workerow. U mnie workery robia pewna robote i nasluchuja az przyjdzie cos z kolejki, jezeli doszloby do tego ze padna, a potem skrypt je odnowi, nie chce, zeby wszystko jeden worker zrobil

Poza dystrybucja wiadomosci, traktuje rabbitmq jako sprawiedliwa kolejke i niekoniecznie chce przetworzyc jak najszybciej, a wlasnie zapewnic harmonie kolejnosci, dlatego uzywam chociazby round robin.

2

Wnioskując z tak dziwacznych założeń - coś masz nie tak w projekcie tego tajemniczego systemu. Teraz próbujesz przerobić młotek, żeby dało się nim wkręcać śruby. Może ten load balancer powinien stać za workerami, a nie przed nimi.

2

Mam wrażenie, że na poczcie chciałbyś, żeby wszystkie okienka były otwarte zanim klienci zaczną być obsługiwani. Jak dla mnie, takie założenie to jakiś nonsens.

Skoro 1 worker jest w stanie przetworzyć te wiadomości zanim wstaną inne workery, to po co Ci kolejne workery? Dlaczego chcesz zapobiegać opisanej sytuacji?
Tak sobie tak założyłeś, czy masz jakiś konkretny problem?

0

Nie twierdze, ze byc moze uzylem zlego narzedzia do zadania, ale jak sobie pomyslalem o tym co chce osiagnac, to pierwsze co przyszlo mi na mysl to: albo zrobic to samemu albo uzyc rabbitmq, bo znacznie skroci mi czas developmentu, a efekt bylby bardzo podobny (tylko gorszy, od tego sa narzedzia). Wiec powiem co mniej wiecej chcialbym osiagnac:

Mamy pewne encje, zalozmy ze jest ich 5. One sa naszymi workerami, czekaja na robote ktora przychodzi z kolejki. Encje maja dostawac prace rownomiernie, niewazne ile czasu im to zajmie. Czyli jesli mamy 10 rzeczy do wykonania, to kazda z tej encji ma wykonac po 2 roboty.

Idealnie pasuje mi tutaj uzycie rabbitmq: leci do kolejki, tworze 5 workerow z round-robin i jest super, ale problem pojawia sie kiedy bede chcial je restartowac, a publisher wysle juz kilka wiadomosci.

Podajac przyklad poprzedni. Nie mam gwaracji ze kazdy worker zrobi po 2 roboty, bo bedzie taka sytuacja, ze jeden worker zrobi 3-4. Naprawde, to taki wymysl? Po prostu brakuje mi tutaj jakies flagi typu "konsumuj jesli podlaczy sie X consumerow"

0

Jak chcesz taki model, to może partycjonowanie kolejki i consumer per partycja będzie dla Ciebie ok.

https://github.com/rabbitmq/rabbitmq-sharding

0

Shard -rfdx prostytutka

prostytutka

1 użytkowników online, w tym zalogowanych: 0, gości: 1