Dlaczego Redis do kolejkowania?
Mam wrażenie, że Redis może być dobrym kandydatem do wdrożenia systemu kolejkowania. Do tego momentu korzystaliśmy z naszej bazy danych MySQL z odpytywaniem lub RabbitMQ. Z RabbitMQ mieliśmy wiele problemów - biblioteki klienckie są bardzo ubogie i mają błędy, i nie chcielibyśmy poświęcać zbyt wiele godzin programistycznych na ich naprawę, kilka problemów z konsolą zarządzania serwerami itp. I na razie będąc co najmniej, nie bierzemy pod uwagę milisekund ani poważnego zwiększania wydajności, więc dopóki system ma architekturę, która inteligentnie obsługuje kolejkę, prawdopodobnie jesteśmy w dobrej formie.
Okej, więc to jest tło. Zasadniczo mam bardzo klasyczny, prosty model kolejek - kilku producentów produkujących pracę i kilku konsumentów zużywających pracę, a zarówno producenci, jak i konsumenci muszą być w stanie inteligentnie skalować. Okazuje się, że naiwny PUBSUB
nie działa, ponieważ nie chcę, aby wszyscy abonenci korzystali z pracy, chcę tylko, aby jeden subskrybent otrzymał pracę. Przy pierwszym przejściu wydaje mi się, że BRPOPLPUSH
to inteligentny projekt.
Czy możemy użyć BRPOPLPUSH?
Podstawowy projekt BRPOPLPUSH
polega na tym, że masz jedną kolejkę roboczą i kolejkę postępu. Kiedy konsument otrzymuje pracę, atomowo wpycha przedmiot do kolejki postępu, a gdy kończy pracę, to LREM
jest to. Zapobiega to zakłócaniu pracy w przypadku śmierci klientów i sprawia, że monitorowanie jest dość łatwe - na przykład możemy stwierdzić, czy występuje problem, który powoduje, że konsumenci zajmują dużo czasu, oprócz informowania, czy jest duża liczba zadań.
Zapewnia
- praca jest dostarczana dokładnie jednemu konsumentowi
- praca kończy się w kolejce postępu, więc nie może zrobić dziury, jeśli konsument
Wady
- Wydaje mi się dość dziwne, że najlepszy projekt, który znalazłem, w rzeczywistości nie używa,
PUBSUB
ponieważ wydaje się, że na tym skupia się większość postów na blogu o kolejkach nad Redis. Mam wrażenie, że brakuje mi czegoś oczywistego. Jedynym sposobem, w jaki widzę, abyPUBSUB
nie używać dwukrotnie zadań, jest po prostu wysłanie powiadomienia o nadejściu pracy, które konsumenci mogą wtedy nie blokowaćRPOPLPUSH
. - Nie można żądać więcej niż jednego elementu pracy na raz, co wydaje się być problemem z wydajnością. Nie jest to duży jak na naszą sytuację, ale raczej oczywiste jest, że ta operacja nie została zaprojektowana z myślą o dużej przepustowości ani takiej sytuacji
- W skrócie: czy brakuje mi czegoś głupiego?
Dodałem także tag node.js, ponieważ to jest język, z którym najczęściej mam do czynienia. Węzeł może oferować pewne uproszczenia we wdrażaniu, biorąc pod uwagę jego jednowątkowy i nieblokujący charakter, ale ponadto korzystam z biblioteki redis węzła i rozwiązania powinny lub mogą być wrażliwe na jego mocne i słabe strony.