Po pierwsze, mamy 100 nieprzetworzonych wiadomości na naszym serwerze rabbitmq, losowo otwieramy klienta konsumenckiego i pojawia się następująca sytuacja,
100 danych, wszystkie przedane w mgnieniu oka, ale nie możemy przetwarzać tylu danych naraz z jednym klientem, co powinniśmy zrobić?
Jak pokazano na powyższym obrazku, nie potwierdziliśmy otrzymania wiadomości! Jeśli producent będzie dalej wysyłał materiał, my, konsumenci, będziemy je nadal otrzymywać!
Wyobraź sobie, że my, pojedynczy konsument, możemy przetworzyć do 60 wiadomości w 1 minutę, natomiast producent może wysłać 300 wiadomości w 1 minutę, jeśli,Mamy klienta konsumenckiego, który musi odebrać 300 wiadomości jednocześnie w ciągu 1 minuty, co przekroczyło nasze maksymalne obciążenie, co może prowadzić do wyczerpania zasobów serwera i zablokowania klienta klienta。
RabbitMQ oferuje funkcję qoS (Quality of Service), to znaczy, na założeniu nieautomatycznego potwierdzenia wiadomości, jeśli nie zostanie potwierdzona określona liczba wiadomości (ustawiając wartość Qos na podstawie konsumpcji lub kanału), nowe wiadomości nie zostaną zużyte.
prefetchSize:0 prefetchCount: Mówi RabbitMQ, aby nie wysyłał więcej niż N wiadomości do konsumenta jednocześnie, tzn. gdy pojawi się N wiadomości, które jeszcze nie zostały ackowane, konsument zablokuje do momentu ackowania wiadomości global:true\false Czy powyższe ustawienia dotyczą kanałów, mówiąc uprości, czy powyższe ograniczenia dotyczą poziomu kanałów czy konsumentów
Uwaga: Mówi się, że prefetchSize i global nie są implementowane przez rabbitmq, więc na razie nie będę ich studiować
prefetch_count wchodzi w życie, gdy no_ask=fałszywe,To znaczy, w przypadku automatycznej odpowiedzi, te dwie wartości toNie obowiązujeof
Ustaw prefetchCount = 3 za pomocą metody BasicQos. Pozwala to RabbitMQ przetwarzać do 3 wiadomości na jednego klienta jednocześnie. Innymi słowy, nie będzie rozesłaniać nowych wiadomości do konsumenta, dopóki nie otrzyma ACK. Oto jak to skonfigurować:
Jak widać na rysunku, dwóch konsumentów słucha Queue jednocześnie, ale należy zauważyć, że komunikat tutaj zostanie automatycznie zaakceptowany tylko wtedy, gdy jeden użytkownik go konsumuje, a drugi nie otrzyma go ponownie.
Oficjalne wprowadzenie do strony internetowej: http://www.rabbitmq.com/consumer-prefetch.html
Należy zauważyć, że ta metoda może powodować pełne kolejki. Oczywiście może być konieczne dodanie większej liczby konsumentów lub stworzenie więcej wirtualnych hostów, aby udoskonalić swój projekt.
|