4

Python アプリケーションで AMPQ サービスを使用したいのですが、ZeroMQ を使用したことがありません。だから私はこれができるかどうか知りたい:

  • receiver1.py と receiver2.py は、1 つのホストとポートから「common_messages」にサブスクライブします
  • receiver2.py がクラッシュする
  • 送信者がメッセージを送信する
  • receiver1.py は正常に受信しました
  • receiver2.py が再起動されます
  • receiver2.py は、不在の間に送信されたメッセージを受信します

これはできますか?ZeroMQ は送信されたメッセージを追跡しますか? メッセージが送信された後にサブスクライブした場合、ZMQ はどの古いメッセージを受信する必要があり、どれを受信すべきでないかを検出しますか?

4

2 に答える 2

3

g19fanatic has already answered your question.

彼の答えに付け加えます:

ZeroMq はスーパー ソケットを提供します。これを使用する主な利点は、コミュニケーション パターンを特定すると、非常に簡単に使用できることです。あなたは心配する必要はありません

  1. 通常のソケットとは異なり、メッセージ全体を読み取る
  2. 通常のソケットと同じように、ソケットの作成と詳細について心配する必要はありません。
  3. 通常のソケットとは異なり、zeromq ソケットは複数の zeromq ソケットに接続できます。とても有利です。

ただし、ZeroMq はメッセージの永続性の問題を解決しません。(ZeroMQ はゼロ メッセージ キューの略です)。AMQP 実装のようなメッセージ キューは、メッセージ キューイングと配信の保証を提供します。配信されるまでメッセージを保存します。これを実現するために、より複雑なプロトコル (AMQP) を利用します。ZeroMQ はメッセージング パターンのみを提供します。

その上に、プロトコル、永続性、またはその他のプロパティを実装する必要があります。

  1. ZeroMQ クライアントで AMQP インフラストラクチャを使用することを好む人もいます。

    ZeroMQ をクライアントとして使用するには、RabbitMq プラグインを参照してください。

    https://serverfault.com/questions/80679/how-to-pick-between-rabbitmq-and-zeromq-or-something-else

  2. 他の解決策は、Redis Pub/Sub を使用することです: http://redis.io/topics/pubsub

  3. 他の人はそれを組み合わせます。https://github.com/pete0emerson/commander
于 2012-06-20T17:47:30.983 に答える
3

PUB-SUB 接続を使用している場合 (説明しているように見えます)、簡単な答えはノーです。パブリッシングソケットは、メッセージをキューに入れる代わりにドロップします。

ソケット タイプを PUSH および PULL に変更しても、問題は発生します。はい、PUSH ソケットは受信されていないメッセージをブロックしますが、別のクライアントが接続されているため、メッセージが送信され、クライアントの 1 つがドロップされてもブロックされません。PUSH-PULL タイプでは、PUB-SUB 接続でできるように、特定のメッセージを「サブスクライブ」することはできません。

説明していることを実行するためのロジックを実装できます。zmq のガイド(箇条書きの 2 番目の項目) をチェックして、信頼できる接続のために何が「推奨」されているかを確認してください。説明しているのは、基本的に、クライアントが受信するメッセージを追跡する方法 (ID を増やしますか?) と、クライアントが「見逃したメッセージの再送信を要求する」ことができる 2 番目の接続です。


上記のセクションは、受信した最後のメッセージを提供するクライアントからサーバーへの「ハートビート」を使用して実装することもできます。サーバーはこれをチェックして、クライアントが遅れていないことを確認し、遅れている場合はメッセージを再発行します。

于 2012-06-20T16:46:06.367 に答える