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 PUBSUBnie 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 BRPOPLPUSHto inteligentny projekt.
Czy możemy użyć BRPOPLPUSH?
Podstawowy projekt BRPOPLPUSHpolega 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 LREMjest 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,
PUBSUBponieważ 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ę, abyPUBSUBnie 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.