2

ZeroMQガイドの図41で定義されている標準のLRUキューを使用していますが、消えたエンドポイント(サーバーのクラッシュ、OOMキラー、これらの線に沿ったもの)にメッセージを送信しないように、保護を追加する方法を考えています。 )。

ドキュメントから、XREPは、存在しないエンドポイントに送信される場合にメッセージをドロップするだけであり、そのことについて通知を受ける方法がないことを読みました。そのような通知を受け取る方法はありますか?最初に「ping」を送信する必要がありますが、応答がない場合、その「ワーカー」は私にとって死んだ肉です。メッセージが返されるのは、pingを送信したのと同じクライアントであることをどうやって知ることができますか?

それとも、私のユースケースはZeroMQに適していませんか?メッセージが受信されたことを確認したいだけです。知らないうちにメッセージが床に落とされたくないのですが...

4

1 に答える 1

3

ワーカーが生きているかどうかを知るために ping を実行すると、競合状態が発生します。ワーカーは、死ぬ直前に ping に応答する可能性があります。

ただし、リクエストの処理中にワーカーが停止しないと想定している場合(この場合、できることはほとんどありません)、ワーカーと中央キューの間の通信の流れを逆にすることができます。ワーカーが ( REQ/REP接続を使用して) キューからリクエストを取得し、処理が完了したときに元のエンベロープと共に応答を送信するようにします (上記と同じソケットを使用するか、別のPUSH/PULL接続を使用することをお勧めします)。

このシナリオでは、死亡したワーカーにはリクエストを取得できないため、リクエストが送信されないことがわかります (死んでいる…)。さらに、中央キューは、特定の時間内にすべてのリクエストに対する応答を確実に受信することもできます。そうでない場合は、リクエストをキューに戻して、新しいワーカーがすぐにリクエストを取得できるようにします。このように、リクエストの処理中にワーカーが停止した場合でも、リクエストは最終的に処理されます。

(補足: 特定のリクエストが原因でワーカーがクラッシュした場合は注意してください。ワーカーを 1 つずつ強制終了したくない場合や、リクエストの試行回数を最大にしたい場合があります)

編集:私が何を意味するかを説明するために、他の方向を実装するコードをいくつか書きました。

于 2010-12-07T20:52:37.430 に答える