RabbitMQ - podział zadań

0

Mam taką sytuację:
mam do wykonania 100 zadań (które trigeruję jednocześnie), i 4 kolejki (A,B,C,D)
Każde z zadań może być wykonane na dwóch z 4 kolejek.
Czy RabbitMQ pozwala na równomierny podział zadań do kolejek? Chodzi o to, że jeżeli zadanie może być obsłużone przez kolejkę A lub C, to chcę ją przydzielić do tej, która jest pusta. Myślałem aby do kolejki wkładać tylko jedno zadanie i dopóki consumer nie pobierze tego zadania z kolejki i nie obsłuży to jest ona zapełniona. Tylko, że pobiorę 5 zadań, włożę je do kolejki, a co zrobić z 95, żeby nie blokowały mi aplikacji? Tym bardziej, że obsługa jednego zadania może trwać od 1min do 30min i na etapie wkładania jej do kolejki nie wiem ile czasu zajmie jej obsługa.
Podsumowując, chciałbym uniknąć sytuacji gdzie:
kolejka A (zad1:30min, zad2:10min, zad3: 5min)
kolejka B(zad4:5min, zad5: 5min)
i mieć taką:
kolejka A (zad1:30min)
kolejka B(zad2:10min, zad3: 5min, zad4:5min, zad5:5min)

0

Chyba przeznaczenie kolejki jest inne. Mi to nie gra.

Te zadania są w jednym procesie, czy w niezależnych procesach?

0

Może nieprecyzyjnie się wyraziłem. Mam 100 zleceń na wykonanie zadań. Chcę je włożyć do kolejki, a później jak consumer je obsłuży to osobna kwestia. Natomiast wykonanie jednego zadania może trwać 1min a może 30min i chciałbym, te 100 zleceń (message, task, whatever jak to nazwiemy) rozłożyć równoniernie. Tak aby nie było sytuacji, że jedna kolejka będzie zapchana, a druga pusta

2

Powinieneś mieć jedną kolejkę oraz wielu konsumentów (workerów) - dzięki temu każdy worker będzie w stanie pobrać po jednym zadaniu i przetwarzać je równocześnie.

2

Skro są to zadania należące do jednej grupy dlaczego chciałbyś rozdzielać je na wiele kolejek? Z tego co rozumiem to kwestia workerów i ich dostępności bardziej niż podziału na kolejki. Więc Twoim zadaniem jest zapewnienie odpowiedniej ilości workerów, ale jak na raz chesz mieć przetworzone 100 zleceń to musisz mieć przynajmniej te 100 workerów dostępne, jeśli faktycznie nie chciałbyś mieć zapchanej kolejki (a to znowu kwestia dostępności zasobów).

0
mlp99 napisał(a):

Tylko, że pobiorę 5 zadań, włożę je do kolejki, a co zrobić z 95, żeby nie blokowały mi aplikacji?

Coś nie gra w zeznaniach.

  1. skąd pobierzesz? Źle im tam, gdzie są?

  2. 95 oczekujące w kolejce nie blokują aplikacji.

  3. Co masz na myśli, jakoby te workery się różniły, i nie każdy mógł wykonać wszystko

0

Ok, powoli zaczynam łapać. Faktycznie pomysł z jedną kolejką i wieloma workerami ma sens. Po części, rozwiązaniem moich problemów jest także ten post:
https://stackoverflow.com/questions/49190175/rabbitmq-a-worker-listen-to-many-queue-but-get-1-message-at-a-time
Jednak. Tak jak pisałem na początku. Nie każdy worker może wykonać każde zadanie. W momencie, kiedy na początku kolejki mam task, który nie może być wykonane przez żadnego workera, to task ten blokuje mi kolejkę. W związku z tym, powinien zostać odrzucony z negative acknowladgement i wrócić do kolejki. Jednak z tego co wyczytałem, basic.reject powoduje, że task wraca na początek kolejki ( a mi wobec powyższego zależałoby aby task wrócił na koniec kolejki i aby mogły wykonać się kolejne taski z kolejki)

2

Nie każdy worker może wykonać każde zadanie.

W takim przypadku robi się kolejki dedykowane odpowiednim komendom i subskrybuje do nich procesy wykonujące zadania

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