2012-06-28 25 views
5

Senaryo: Coğrafi olarak dağıtılmış birden çok düğümümüz var. Bu konumlar için iletileri toplayan kuyruklara sahip olmak istiyoruz. Ve sonra toplanan bu verileri her düğümdeki her sıradan, merkezi bir konumda karşılık gelen sıralara göndermek istiyoruz. Merkezi düğümde, kuyruklarda toplanan verileri (diğer düğümlerden) çıkaracağız, işleyeceğiz ve ısrarla saklayacağız.Bir sıra örneğini birden çok Redis örneğiyle senkronize edin

Kısıtlamalar:

  • veriler bizim için çok önemlidir. Bu nedenle, her halükarda veri kaybetmediğimize emin olmalıyız.
  • Bu nedenle, her düğümde kalıcı kuyruklara ihtiyacımız var, böylece düğüm rastgele bir nedenden ötürü aşağı inerse bile, topladığımız zaman toplanan verileri bizimle güvende tutuyoruz ve bunu yapabileceği merkezi düğüme gönderebiliyoruz. işlendi.
  • Benzer şekilde, eğer merkezi düğüm aşağı düşerse, veriler tüm düğümlerde kalmalıdır, böylece merkezi düğüm geldiğinde tüm verileri işlemek için merkezi düğüme gönderebiliriz. Ayrıca, merkezi düğümdeki veriler çoğaltılmamalı veya yeniden depolanmamalıdır. Bu düğümlerden birinde toplanan veriler, merkezi düğümlerde sadece bir kez saklanmalıdır.
  • Topladığımız veriler bizim için çok önemlidir ve merkezi düğümün veri teslimi sırası bir sorun değildir.

Çözüm Biz biz iyi olacağını düşündüm birini aşağı listelemek için gidiyorum hangi dışarı çözümlerinin birkaç kabul var. Olası bir çözüm (bizim düşüncemize göre), Redis'i kalıcı depolama sağladığından, her yerde kuyrukları korumak için Redis kullanmaktır. Daha sonra belki de kuyruktan gelen verileri okuyan ve merkezi düğüme gönderen tüm coğrafi olarak ayrılmış düğümlerde çalışan bir daemon var. Verileri almanın merkezi düğümü, veriyi aldığı düğümdeki bir ACK'yi gönderir (çünkü veriler bizim için çok önemlidir) ve ardından ACK'yi alırken, düğüm, verileri kuyruktan siler. Elbette, ACK'nın alınması gereken zaman aşımı süresi olacaktır.

Sorun (bize göre) Yukarıda belirtilen çözelti iyi çalışır ancak sorun biz burada yanlış olabilir basit bir nedenle kendimiz bütün senkronizasyon protokolü uygulamak istemiyoruz olmasıdır. Redis'te bu özel senkronizasyon yolunu bulamadık. Bu yüzden, RabbitMQ, ZeroMQ, vb. Gibi diğer AMQP tabanlı sıralara açığız. Bu çözümleri kullanarak bunu yapıp yapamayacağımızı anlayamadık.

  • Bu Message Queues veya başka bir veri deposu, sorunumuzun çözümü olabilecek özellikler sağlar mı? Evet ise nasıl olacak?
  • Değilse, çözümümüz yeterince iyi mi?
  • Daha iyi bir çözüm önerisi olan var mı?
  • Bunu yapmanın daha iyi bir yolu olabilir mi?
  • Güvenli hale getirilmemesinin en iyi yolu ne olurdu?
  • Topladığımız veriler bizim için çok önemlidir ve merkezi düğümün veri teslimi sırası bir sorun değildir.

cevap

4

diğer düğümlerden mesajların bir tüketici olmak için merkezi düğümü (veya düğümleri küme) kurma ve mesaj bildirim özelliğini kullanarak RabbitMQ ile bu yapabilirdi. Bu özellik, merkezi düğüm (ler) in teslimatı sağlayabileceği anlamına gelir, böylece diğer düğümler sadece ack'den sonra mesajları siler. Bakınız örneğin: http://www.rabbitmq.com/tutorials/tutorial-two-python.html

Daha fazla sorunuz varsa lütfen rabbitmq-discuss e-posta listesine başvurunuz.

+0

Doğru iş için doğru aracı kullanın: RabbitMQ, onaylama, kalıcılık ve (gelişmiş) ileti yönlendirmesi gerektiğinde kesinlikle doğru araçtır. – FGRibreau

+0

"Ayrıca, merkezi düğümdeki veriler tekrar kopyalanmamalı veya tekrar saklanmamalıdır. Bu düğümlerden birinde toplanan veriler, merkezi düğümlerde yalnızca bir kez saklanmalıdır." Bunu nasıl temin ederim? Ağ sorunlarından dolayı ACK'nın teslim edilmediğini düşünün (bizim senaryoda). Bu durumda ne olur? Sıra hala işin tamamlanmasının durumunu bilmiyor. Bu durumda mesaj kilitlenir mi? Yoksa başka bir işçi alır mı? Eğer başka bir işçi alırsa, aynı verinin iki kez çalışacağını biliyoruz, değil mi? – vaidik

İlgili konular