2012-06-28 17 views
5

シナリオ: 地理的に分散して、その場所のメッセージを収集するキューを持つノードがあります。そして、収集されたデータをすべてのノードのすべてのキューから中央の対応するキューに送信します。中央ノードでは、キュー内で収集されたデータを(他のノードから)取り出し、処理して永続的に格納します。1つのキューインスタンスを複数のRedisインスタンスと同期させる

制約:

  • データは私達にとって非常に重要です。したがって、いかなる場合でもデータが失われていないことを確認する必要があります。
  • したがって、ノードが何らかのランダムな理由でダウンしても、ノードを持ち出すときに収集されたデータを安全に保ち、できるだけ中央のノードに送信できるように、すべてのノードに永続キューが必要です処理される。
  • 同様に、セントラルノードがダウンした場合、データは他のすべてのノードに残っていなければならないため、セントラルノードが起動するとすべてのデータをセントラルノードに送信して処理できます。
  • また、中央ノード上のデータが重複したり、再度格納されてはならない。つまり、ノードの1つで収集されたデータは、中央ノードに1回だけ格納する必要があります。
  • 収集しているデータは非常に重要であり、中央ノードへのデータ配信の順序は問題になりません。

当社のソリューション 私たちは、私たちは最高のだろうと思ったものをダウンリストしようと思っているのうち、ソリューションのカップルと考えられてきました。可能な解決策(私たちの意見)では、Redisは永続的なストレージを提供するため、Redisを使用してキューをすべて維持します。次に、地理的に離れたすべてのノードでデーモンを実行し、キューからデータを読み取り、それをセントラルノードに送信します。データを受信する中央ノードは、(データが非常に重要であるため)データを受信したノードにACKを送信し、ACKを受信すると、ノードはキューからデータを削除します。もちろん、ACKを受信する必要があるタイムアウト期間があります。 (私たちによる)

問題 上記のソリューションは、正常に動作しますが、問題は、我々はここで間違っているかもしれない単純な理由のために自分自身によって全体の同期プロトコルを実装したくないということです。 Redisでは、このような特定の同期方法を見つけることができませんでした。だから私たちはRabbitMQ、ZeroMQなどのAMQPベースの他のキューにもオープンしています。これらのソリューションでこれを実行できるかどうかはわかりませんでした。

  • これらのメッセージキューまたは他のデータストアは、私たちの問題の解決策となる機能を提供していますか?はいの場合は、どうですか?
  • そうでなければ、私たちのソリューションは十分ですか?
  • もっと良い解決策を提案できる人はいますか?
  • もっと良い方法がありますか?
  • 安全に失敗させる最も良い方法は何ですか?
  • 収集しているデータは非常に重要であり、中央ノードへのデータ配信の順序は問題になりません。

答えて

4

中央ノード(またはノードのクラスタ)を他のノードからのメッセージのコンシューマに設定し、メッセージ確認機能を使用することで、RabbitMQでこれを実行できます。この機能は、中央ノードが配信を拒否できるため、他のノードがack後のメッセージのみを削除できることを意味します。たとえば、次を参照してください。http://www.rabbitmq.com/tutorials/tutorial-two-python.html

さらなる質問がある場合は、rabbitmq-discussのメーリングリストにメールしてください。

+0

正しい仕事に適切なツールを使用してください:RabbitMQは、承認、永続性、(高度な)メッセージルーティングが必要な場合には、間違いなく適切なツールです。 – FGRibreau

+0

"中央ノードのデータは重複してはいけません。つまり、ノードの1つで収集されたデータは中央ノードに1回だけ格納されます。これをどうすれば保証できますか?ネットワークの問題(このシナリオでは)のためにACKが配信されないと考えてください。その場合はどうなりますか?キューは依然として作業完了の状態を認識していません。その場合のメッセージはロックされますか?それとも、別の労働者がそれを手に入れますか?別の労働者がそれを取り上げると、同じデータが2回働くでしょう。 – vaidik

関連する問題