1

私は、プロセス(プロデューサーなど)が可変数のプロセス(コンシューマーなど)に一方向メッセージを送信する必要があるという要件に取り組んでいます。

パブリッシュ/サブスクライブ モデルは、コンシューマーがプロデューサーからのメッセージをサブスクライブするため、これには適しているように思われました。これを実現するためにZeroMQを使用してみました。

ただし、いくつかの問題があります。

  1. コンシューマはメッセージを継続的にポーリングする必要があります。新しいメッセージがあるときに消費者に通知するようにします。

  2. プロデューサー キューがいっぱいになる可能性があります。プロデューサーが何らかの条件に基づいてキューからメッセージを削除することを望んでいました (たとえば、5 秒以上経過したメッセージを削除する、または 5 回読み取られたメッセージを削除するなど)。

  3. コンシューマーはポーリングしており、メッセージはキューから削除されないため、コンシューマーには新しいメッセージが着信するまでメッセージが重複して表示されます。新しいメッセージごとに 1 回だけコンシューマーに通知する必要があります。

間違ったモデルを使用している可能性があることを理解しています (publish-subscribe は適していない可能性があります)。request-reply を使用することを考えましたが、プロデューサーはコンシューマーの数を追跡したくないため、うまくいきません。

誰かが良い代替案を提案できますか?

4

4 に答える 4

1

DDS (データ配信サービス) ミドルウェアは、達成しようとしているものを正確にサポートし、はるかに簡単にサポートします。

質問に直接答える:

  1. DDS はリスナー メカニズムをサポートしているため、サブスクライバーは継続的にポーリングする必要はありません。

  2. DDS には、パブリッシャ キューがいっぱいになるのを防ぐための適切な QoS 設定があります。History QoS を使用して「最新の 10 個のサンプルのみをキューに保持する」と指定するか、Lifespan QoS を使用して「過去 10 秒間に公開されたサンプルのみを保持する」と指定できます。

  3. ここでも、DDS リスナー メカニズムを使用でき、新しいサンプルごとに 1 回だけ通知されます。投票する必要はありません。

現在、2 つのオープン ソース実装があります。

于 2012-05-31T08:50:15.713 に答える
1

Producer と Consumer の間に Broker を配置した Push-Pull モデルをお勧めします。

  1. ブローカーは、新しいメッセージについて通知を受ける必要があります。
  2. コンシューマーはブローカーが通知するのをリッスンします (成功/失敗を追跡するためにテーブルを保持します。したがって、再試行中に重複が回避されます)
  3. #2 が完了すると、コンシューマーはプロデューサー (ソース) からデータを取得し、成功/失敗の確認をブローカーに送信できます。

お役に立てれば

于 2012-05-28T07:45:53.427 に答える
0

JMSプロバイダーまたはAMQPプロバイダーを使用してみてください。これらには、トピックで探しているものがいくつかあります。

  1. サブスクライバーに通知をプッシュします。

  2. メッセージがTTL内で消費されない場合に、メッセージを削除したり、配信不能キューに入れたりできるようにする、メッセージの存続時間属性。

  3. 1回限りの通知-構成によって異なります。

一度だけのメッセージングには、ネットワーク障害が発生した場合にエッジ条件があり、メッセージが失われたり、メッセージが重複したりする可能性があることに注意してください...選択します。

使用する提供者に関して。RabbitMQはAMQPで人気があります。JMSの場合、独自の製品またはオープンソースの実装がいくつもあります。

于 2012-04-10T10:23:32.247 に答える
0

複数のプロデューサーが必要ですか? そうでない場合は、PUB/SUB の代わりに PUSH/PULL を使用できます。

PUSH/PULL を使用すると、必要な数のコンシューマーを持つことができます (モデルの PULL 側です)。PUSH エンドポイントに書き込まれるすべてのメッセージは、接続されているすべてのコンシューマー間でラウンド ロビン スタイルで分散されます。これにより、2 つのコンシューマが同じメッセージを受信しないことも保証されます。

あなたが説明したように、コンシューマーを SUB エンドポイントとして持つと、2 つ以上のコンシューマーが同じ「プレフィックス」にサブスクライブされている場合、同じメッセージを複数のコンシューマーに配信することになります (これがモデルで問題になると仮定します)。

「プレフィックス」が渡す文字列であると仮定しますsock.setsockopt(ZMQ_SUBSCRIBE, "prefix", ...);

于 2012-03-28T01:13:55.453 に答える