Jestem nowym brokerem wiadomości, takim jak RabbitMQ, którego możemy używać do tworzenia zadań / kolejek wiadomości dla systemu planowania, takiego jak Celery .
Oto pytanie:
Mogę utworzyć tabelę w PostgreSQL, która może być dołączona do nowych zadań i wykorzystana przez program konsumencki, taki jak Celery.
Dlaczego, u licha, miałbym chcieć skonfigurować zupełnie nową technologię do tego typu, jak RabbitMQ?
Teraz uważam, że skalowanie nie może być odpowiedzią, ponieważ nasza baza danych, taka jak PostgreSQL, może działać w środowisku rozproszonym.
Poszukałem, jakie problemy stwarza baza danych dla konkretnego problemu, i znalazłem:
- odpytywanie utrzymuje bazę danych zajętą i niską wydajność
- blokowanie stołu -> ponownie niska wydajność
- miliony rzędów zadań -> znowu, odpytywanie ma niską wydajność
W jaki sposób RabbitMQ lub jakikolwiek inny broker wiadomości rozwiązuje te problemy?
Odkryłem również, że AMQP
protokół jest tym, co następuje. Co w tym dobrego?
Czy Redis może być również używany jako broker wiadomości? Uważam to za bardziej analogiczne do Memcached niż RabbitMQ.
Proszę rzucić nieco światła na to!
źródło
celery
” - właśnie nauczyłem się z pytania czegoś, co będzie przydatne w moim projekcie . Teraz przeczytaj odpowiedzi ...Odpowiedzi:
Kolejki królika znajdują się w pamięci i dlatego będą znacznie szybsze niż implementacja tego w bazie danych. (Dobra) dedykowana kolejka komunikatów powinna również zapewniać istotne funkcje związane z kolejkowaniem, takie jak ograniczanie przepustowości / kontrola przepływu oraz możliwość wyboru różnych algorytmów routingu, aby wymienić kilka (królik zapewnia te i wiele innych). W zależności od wielkości projektu możesz także chcieć, aby komponent przekazujący wiadomości był oddzielony od bazy danych, aby w przypadku dużego obciążenia jednego komponentu nie musiał on utrudniać działania drugiego.
Co do problemów, o których wspomniałeś:
odpytywanie utrzymując Buzy bazy danych i mało skuteczne : Korzystanie RabbitMQ, producenci mogą popchnąć aktualizacje dla klientów, które jest znacznie bardziej wydajnych niż odpytywanie. Dane są po prostu wysyłane do konsumenta, kiedy jest to konieczne, eliminując potrzebę marnotrawstwa kontroli.
blokowanie stołu -> ponownie słabo wydajny: Nie ma stolika do zablokowania: P
miliony rzędów zadań -> znowu odpytywanie jest mało wydajne: jak wspomniano powyżej, Rabbitmq będzie działał szybciej, ponieważ rezyduje w pamięci RAM i zapewnia kontrolę przepływu. W razie potrzeby może także użyć dysku do tymczasowego przechowywania wiadomości, jeśli zabraknie pamięci RAM. Po wersji 2.0 Rabbit znacznie poprawił wykorzystanie pamięci RAM. Dostępne są również opcje grupowania.
Jeśli chodzi o AMQP, powiedziałbym, że naprawdę fajną funkcją jest „wymiana” i możliwość kierowania jej na inne giełdy. Daje to większą elastyczność i umożliwia tworzenie szerokiej gamy skomplikowanych typologii routingu, które mogą być bardzo przydatne podczas skalowania. Dobry przykład:
(źródło: springsource.com )
oraz: http://blog.springsource.org/2011/04/01/routing-topologies-for-performance-and-scalability-with-rabbitmq/
Wreszcie, jeśli chodzi o redis, tak, można go używać jako brokera wiadomości i może dobrze. Jednak Rabbitmq ma więcej funkcji kolejkowania wiadomości niż redis, ponieważ rabbitmq został zbudowany od podstaw, aby być w pełni funkcjonalną dedykowaną kolejką komunikatów na poziomie przedsiębiorstwa. Z drugiej strony Redis został stworzony przede wszystkim jako magazyn kluczy i wartości w pamięci (choć robi o wiele więcej niż teraz; jest nawet nazywany szwajcarskim scyzorykiem). Mimo to czytałem / słyszałem, że wiele osób osiąga dobre wyniki dzięki Redis w przypadku mniejszych projektów, ale niewiele słyszałem o tym w większych aplikacjach.
Oto przykład użycia redis w implementacji czatu o długim sondowaniu: http://eflorenzano.com/blog/2011/02/16/technology-behind-convore/
źródło
PostgreSQL 9.5
Zawiera PostgreSQL 9.5
SELECT ... FOR UPDATE ... SKIP LOCKED
. To sprawia, że wdrażanie działających systemów kolejkowania jest o wiele prostsze i łatwiejsze. Nie możesz już wymagać zewnętrznego systemu kolejkowania, ponieważ teraz łatwo jest pobrać wiersze, które nie zostały zablokowane przez żadną inną sesję, i utrzymywać je zablokowane, dopóki nie potwierdzisz wykonania pracy. Działa nawet z transakcjami dwufazowymi, gdy wymagana jest zewnętrzna koordynacja.Zewnętrzne systemy kolejkowania pozostają użyteczne, zapewniając funkcjonalność w puszkach, sprawdzoną wydajność, integrację z innymi systemami, opcje skalowania w poziomie i federacji itp. Niemniej jednak w prostych przypadkach tak naprawdę już ich nie potrzebujesz.
starsza wersja
Nie potrzebujesz takich narzędzi, ale korzystanie z nich może ułatwić życie. Kolejkowanie w bazie danych wygląda na łatwe, ale w praktyce przekonasz się, że w relacyjnej bazie danych bardzo trudno jest wykonać wydajne, niezawodne współbieżne kolejkowanie .
Dlatego istnieją narzędzia takie jak PGQ .
Możesz pozbyć się odpytywania w PostgreSQL za pomocą
LISTEN
iNOTIFY
, ale to nie rozwiąże problemu polegającego na niezawodnym wydawaniu wpisów z górnej części kolejki dokładnie jednemu konsumentowi, przy jednoczesnym zachowaniu bardzo równoczesnego działania i nie blokowaniu wstawek. Wszystkie proste i oczywiste rozwiązania, które według ciebie rozwiążą ten problem, w rzeczywistości nie występują w rzeczywistości i mają tendencję do przekształcania się w mniej wydajne wersje pobierania kolejki dla jednego pracownika.Jeśli nie potrzebujesz wysoce współbieżnych pobierania kolejek z wieloma procesami roboczymi, użycie pojedynczej tabeli kolejek w PostgreSQL jest całkowicie uzasadnione.
źródło
reliably handing out entries off the top of the queue to exactly one consumer while preserving highly concurrent operation and not blocking inserts.
to podsumowuje - prawda?