Dlaczego potrzebujemy brokerów wiadomości takich jak RabbitMQ w bazie danych takiej jak PostgreSQL?

215

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 AMQPprotokół 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!

Yugal Jindle
źródło
9
Wpływ blokowania powinien być znacznie mniejszy w przypadku PostgreSQL, ponieważ implementuje on MVCC, w którym czytniki nie są blokowane przez pisarzy i odwrotnie. Większość artykułów krytykuje użycie baz danych, ponieważ kolejki komunikatów mają na myśli MySQL.
CadentOrange
Broker komunikatów przenosi dane między węzłami, a baza danych przechowuje dane w jednym miejscu. Fakt, że możesz uzyskać dostęp do danych w bazie danych z wielu węzłów, nie sprawia, że ​​jest to dobre narzędzie do szybkiego przesyłania danych między węzłami.
theMayer
2
„system planowania jak celery” - właśnie nauczyłem się z pytania czegoś, co będzie przydatne w moim projekcie . Teraz przeczytaj odpowiedzi ...
Mark K Cowan
używanie producenta brokera komunikatów i konsumenta jest oddzielone.
giorgi dvalishvili
Możesz zobaczyć poniższy link. Ma szeroki opis: stackoverflow.com/a/51377756/3073945
MD Sajedul Karim

Odpowiedzi:

110

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/

Jaigus
źródło
2
Zaimplementowałem implementację JMS (tj. System przekazywania komunikatów) na bazie danych. Mogę powiedzieć, że jest to możliwe, ale nie jest to zabawne i zwykle nie opłaca się to robić. Niektóre z wymienionych przez ciebie problemów można obejść, ale to znacznie zwiększa złożoność. W sumie zgadzam się: użyj dedykowanego systemu MQ, jeśli go potrzebujesz. W przypadku niskich obciążeń można jednak uniknąć posiadania go w bazie danych.
Joachim Sauer
1
Po prostu uwzględniłeś wszystkie obawy / wątpliwości. Świetna odpowiedź!
Yugal Jindle
To interesujące. A tak przy okazji, co z konsekwencją? Co się stanie, jeśli w kolejce znajdują się setki zadań, a węzeł trzymający je w pamięci RAM?
Mahn,
22
W rzeczywistości w PostgreSQL nie ma odpytywania (patrz NOTIFY) ani blokad tabel (patrz MVCC). Chociaż PostgreSQL wciąż nie jest przeznaczony do kolejkowania wiadomości, nie jest całkowicie nieodpowiedni.
jkj
3
Tak jak powiedział @jkj, istnieje NOTIFY i nie ma blokad tabel. Jedynym problemem wydaje się być duża przepustowość wiadomości. Czy nie możesz mieć dedykowanej instancji PostgreSQL zamiast utrzymywać całkowicie nowy system, taki jak Rabbit? Możesz 1) użyć pojedynczej instancji PostgreSQL, aż dojdziesz do wąskiego gardła, a następnie 2) użyć dedykowanego Postgres, a następnie 3) łatwo przełączyć się na Królika jako swojego brokera. Wydaje się, że rozpoczęcie od Królika to optymalizacja wstępna.
Joe
72

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ą LISTENi NOTIFY, 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.

Craig Ringer
źródło
11
linia 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?
Yugal Jindle