3

zmq が既に次の問題を解決しているかどうか (または) zmq の上にあるアプリケーションがそれを処理する必要があるかどうかを知りたいです。

1) すべてのサブスクライバーにデータを公開する中央パブリッシャー。このデータは本質的に静的であり、構成のようなものです。データはいつでも変更できます。
2) 複数のサブスクライバーが、このパブリッシャーからのメッセージをサブスクライブします。パブリッシャーはいつでも参加できます。
3) データが変更された場合、パブリッシャーは差分を既存のサブスクライバーに公開する必要があります。
4) サブスクライバーが後で参加する場合、パブリッシャーはすべてのデータ (現在の構成) を新しいサブスクライバーに公開する必要があります。

Zeromq ガイドは、Slow Joiner 症候群を解決するために次のことを提案していますが、これは上記の問題を解決しません。 http://zguide.zeromq.org/page:all#Slow-Subscriber-Detection-Suicidal-Snail-Pattern

4

2 に答える 2

3

Guide の Clone パターンは、あなたが望むことを正確に行います。

于 2013-05-06T09:52:56.477 に答える
2

私があなたのセットアップで見ている問題は、すべてのサブスクライバーが同じ状態である必要があることです。すべてのサブスクライバーがバージョン 7 で、7 対 8 の差分を公開する場合、それらはすべてバージョン 8 に更新されます。ただし、これにはノード間の密結合状態の同期が必要です。サブスクライバーが同期しなくなった場合、どのように対処しますか?

次の代替設定を検討してください。

  • 「パブリッシャー」には、バインドする単一の ROUTER ソケットがあります
  • 各「サブスクライバー」には、ROUTER に接続する単一の DEALER ソケットがあります。
    • 「更新ヒント」の送信が禁止されるため、REQ ソケットを使用できません (詳細は後述)。
  • サブスクライバーiがネットワークに参加すると、「更新」要求がパブリッシャーに送信されるため、パブリッシャーはサブスクライバーの ID と現在のバージョンを認識できます。version[i]
    • iパブリッシャーは、サブスクライバーを最新の状態にするために必要な差分で応答します
  • パブリッシャーでデータが変更された場合 (つまり、新しいバージョン)、既知のすべてのサブスクライバーに「更新ヒント」が送信されます。
    • サブスクライバが「更新ヒント」を受信すると、「更新」リクエストを実行します
  • (オプション) サブスクライバーは定期的に「更新」リクエストを送信します (まれなポーリング)

このアプローチには、次の利点があります。

  • パブリッシャーはサーバーです。サブスクライバーはクライアントです
  • パブリッシャーは実際のデータの送信を開始することはありません。クライアントからのリクエストにのみ応答します (つまり、「更新ヒント」は実際のデータの送信としてカウントされません)。
  • サブスクライバーはすべて、断続的に同期していない可能性がありますが、すべて独立して最新の状態に保っています (結果整合性)。
于 2013-05-03T19:10:22.773 に答える