PostgreSQL gibi bir veritabanı üzerinden neden RabbitMQ gibi mesaj aracılarına ihtiyacımız var?


215

Kereviz gibi bir zamanlama sistemi için görevler / mesaj kuyrukları oluşturmak için kullanabileceğimiz RabbitMQ gibi mesaj aracılarına yeniyim .

Şimdi soru şudur:

  • PostgreSQL'de yeni görevlerle eklenebilen ve Kereviz gibi tüketici programı tarafından tüketilebilen bir tablo oluşturabilirim .

  • Neden yeryüzünde bunun için yepyeni bir teknoloji kurmak istiyorum?

Şimdi, PostgreSQL gibi veritabanımız dağıtılmış bir ortamda çalışabileceğinden ölçeklemenin cevap olamayacağına inanıyorum.

Veritabanı belirli bir sorun için hangi sorunları yapar googled ve buldum:

  • yoklama, veritabanını meşgul ve düşük performanslı tutar
  • tablanın kilitlenmesi -> tekrar düşük performans
  • milyonlarca görev sırası -> yine, yoklama düşük performans

Şimdi, RabbitMQ veya bunun gibi başka bir mesaj komisyoncusu bu sorunları nasıl çözer?

Ayrıca, AMQPprotokolün takip ettiği şey olduğunu öğrendim . Bunda harika olan ne var?

Can Redis da bir mesaj komisyoncu olarak kullanılabilir? Memcached'a RabbitMQ'dan daha benzer buluyorum.

Lütfen buna biraz ışık tut!


9
PostgreSQL ile kilitlemenin etkisi çok daha az olmalıdır, çünkü okuyucuların yazarlar tarafından engellenmediği MVCC'yi uygular veya bunun tersi de geçerlidir. İleti kuyrukları olarak veritabanlarının kullanımını eleştirdiğim bulduğum makalelerin çoğunda MySQL var.
CadentOrange

Message Broker, verileri düğümler arasında hareket ettirirken, veritabanı verileri tek bir yerde tutar. Bir veritabanındaki verilere birden çok düğümden erişebilmeniz, yüzünde, düğümler arasında hızlı bir şekilde veri aktarımı için iyi bir araç değildir.
Mayıs

2
"gibi zamanlama sistemi celery" - Ben sorudan , benim tasarım yararlı olacak bir şey öğrendim . Şimdi cevapları okumak için ...
Mark K Cowan

Message Broker üreticisi ve tüketicisini kullanarak ayrıştırılır.
giorgi dvalishvili

Körük bağlantısını görüntüleyebilirsiniz. Geniş bir açıklaması var: stackoverflow.com/a/51377756/3073945
Md. Sajedul Karim

Yanıtlar:


110

Tavşanların kuyrukları bellekte bulunur ve bu nedenle bunu bir veritabanına uygulamaktan çok daha hızlı olacaktır. (İyi) özel bir mesaj kuyruğu da kısma / akış kontrolü ve çiftleri adlandırmak için farklı yönlendirme algoritmaları seçme yeteneği gibi sıra ile ilişkili temel özellikleri sağlamalıdır (tavşan bunları ve daha fazlasını sağlar). Projenizin boyutuna bağlı olarak, mesaj geçirme bileşenini veritabanınızdan ayrı olarak da isteyebilirsiniz, böylece bir bileşen ağır yük yaşıyorsa, diğerinin çalışmasını engellemesi gerekmez.

Bahsettiğiniz sorunlara gelince:

  • Veritabanı Buzy ve düşük performans gösteren tutarak yoklama : RabbitMQ kullanarak, üretici olabilir itmek çok daha fazla ölçülebilir yoklama daha hangi tüketicilere güncellemeler. Veriler, yalnızca gerektiğinde tüketiciye gönderilir ve bu da savurgan kontrollere olan ihtiyacı ortadan kaldırır.

  • tablanın kilitlenmesi -> tekrar düşük performans: Kilitlenecek masa yok: P

  • milyonlarca görev sırası -> yine yoklama düşük performans gösterir: Yukarıda belirtildiği gibi, Rabbitmq RAM'de bulunduğu için daha hızlı çalışacak ve akış kontrolü sağlayacaktır. Gerekirse, RAM bittiğinde iletileri geçici olarak saklamak için diski de kullanabilir. 2.0'dan sonra, Tavşan RAM kullanımında önemli ölçüde iyileşti. Kümeleme seçenekleri de mevcuttur.

AMQP ile ilgili olarak, gerçekten harika bir özellik "değişim" ve diğer borsalara yönlendirme yeteneği olduğunu söyleyebilirim. Bu size daha fazla esneklik sağlar ve ölçekleme sırasında çok kullanışlı olabilecek çok çeşitli ayrıntılı yönlendirme tipolojileri oluşturmanıza olanak tanır. İyi bir örnek için bkz:


(kaynak: springsource.com )

ve: http://blog.springsource.org/2011/04/01/routing-topolojiler-for-performans-and-scalability-with-rabbitmq/

Son olarak, redis ile ilgili olarak, evet, bir mesaj komisyoncusu olarak kullanılabilir ve iyi yapabilir. Ancak, Rabbitmq, redis'ten daha fazla mesaj kuyruğu özelliğine sahiptir, çünkü rabbitmq baştan sona tam özellikli kurumsal düzeyde özel bir mesaj kuyruğu olacak şekilde inşa edilmiştir. Öte yandan Redis, öncelikle bellek içi bir anahtar / değer deposu olarak yaratıldı (şimdi bundan çok daha fazlasını yapıyor olsa da, İsviçre çakısı olarak da adlandırılır). Yine de, daha küçük boyutlu projeler için Redis ile iyi sonuçlar elde eden birçok insanı okudum / duydum, ancak daha büyük uygulamalarda pek fazla şey duymadım.

Uzun oylama sohbet uygulamasında kullanılan yeniden kullanım örnekleri: http://eflorenzano.com/blog/2011/02/16/technology-behind-convore/


2
Ben bir veritabanı üzerine bir JMS uygulaması (yani bir mesaj geçen sistemi) uyguladım. Ben söyleyebilirim olan olası, ama eğlenceli değil ve genelde bunu yapmak için bir faydası yoktur. Bahsettiğiniz sorunlardan bazıları çözülebilir, ancak karmaşıklığı oldukça arttırır. Sonuçta katılıyorum: eğer ihtiyacınız varsa, özel bir MQ sistemi kullanın. Bununla birlikte, düşük iş yükleri için DB'ye sahip olmaktan kurtulabilirsiniz.
Joachim Sauer

1
Tüm endişeleri / şüpheleri ele aldınız. Müthiş cevap!
Yugal Jindle

İlginç. Bu arada tutarlılık ne olacak? Bir kuyrukta yüzlerce iş varsa ve bunları ram çökmelerinde tutan düğüm varsa?
Mahn

22
Aslında, PostgreSQL ile yoklama (bkz. NOTIFY) veya tablo kilitleri yoktur (bkz. MVCC). PostgreSQL hala mesaj kuyruğu için tasarlanmamış olsa da, tamamen uygun değildir.
jkj

3
@Jkj'in söylediği gibi, NOTIFY ve tablo kilitleri yok. Tek sorun, mesajların yüksek bant genişliğine benziyor. Tavşan gibi tamamen yeni bir sistemi korumak yerine özel bir PostgreSQL örneğiniz olamaz mı? 1) bir darboğa ulaşana kadar tek bir PostgreSQL örneği kullanabilir, sonra 2) özel bir Postgres kullanabilirsiniz, sonra nihayet 3) broker olarak kolayca Tavşan'a geçebilirsiniz. Tavşan ile başlamak ön optimizasyon gibi görünüyor.
Joe

72

PostgreSQL 9.5

PostgreSQL 9.5 içerir SELECT ... FOR UPDATE ... SKIP LOCKED. Bu, çalışma kuyruğu sistemlerinin uygulanmasını çok daha basit ve kolay hale getirir . Artık başka bir oturumun kilitlenmediği 'n' satırları getirmek ve işin tamamlandığını onaylayana kadar kilitli tutmak için artık harici bir kuyruk sistemine ihtiyacınız olmayabilir. Dış koordinasyon gerektiğinde iki aşamalı işlemlerle bile çalışır.

Dış kuyruk sistemleri, konserve işlevsellik, kanıtlanmış performans, diğer sistemlerle entegrasyon, yatay ölçeklendirme ve federasyon için seçenekler, vb. Sağlayarak kullanışlı kalır. Bununla birlikte, basit durumlar için artık onlara gerçekten ihtiyacınız yoktur.

eski versiyonlar

Böyle araçlara ihtiyacınız yoktur , ancak birini kullanmak hayatı kolaylaştırabilir. Veritabanında kuyruklama yapmak kolay görünüyor, ancak pratikte yüksek performanslı, güvenilir eşzamanlı kuyruklamanın ilişkisel bir veritabanında gerçekten zor olduğunu keşfedeceksiniz .

Bu yüzden PGQ gibi araçlar var.

Sen kullanarak PostgreSQL içinde yoklama kurtulabilirsiniz LISTENve NOTIFYfakat son derece eşzamanlı operasyon koruyarak ve eklere engellemediğini ederken o tam olarak bir tüketiciye kuyruğun üst kapalı girdileri dışarı güvenilir teslim sorununu çözmez. Bu sorunu çözeceğini düşündüğünüz tüm basit ve bariz çözümler gerçek dünyada yok ve tek işçi kuyruğu getirmenin daha az verimli sürümlerine dönüşme eğilimindedir.

Eşzamanlı çok çalışanlı kuyruk getirmelerine ihtiyacınız yoksa PostgreSQL'de tek bir kuyruk tablosu kullanmak tamamen mantıklıdır.


11
satır reliably handing out entries off the top of the queue to exactly one consumer while preserving highly concurrent operation and not blocking inserts. özetliyor - Değil mi?
Yugal Jindle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.