3

私は ZeroMQ の C# ラッパーを使用していますが、これは ZeroMQ の根本的な問題のようです。

ブロックせずにキューに入れずにメッセージをプッシュする方法はありますか? サーバーが稼働していない場合、メッセージをブロックせずに永久に破棄したいと考えています。

これまでに試した設定は次のとおりです。

1)

送信(ブロック送信)

最高水準点 = 0

これは(意図的に)ブロックされませんが、ソケットが接続されるまでメモリ内でキューに入れられているようです(プロセスのためにメモリが増加し続けます)。

2)

送信(ノンブロッキング送信)

最高水準点 = 1

これは競合状態です。立て続けに 2 つのメッセージを送信すると、最高水準点を超えたために 1 つのメッセージが破棄されることがあります。

3)

ソケットをポーリングして、ブロックするかどうかを確認します。ブロッキングを開始する前に 1 つの (古い) メッセージをキューに入れる必要があるため (HWM = 1 に設定した場合)、これはあまり役に立ちません。

サーバーがオンラインに戻るとすぐに、クライアントから大量の古いメッセージを取得するため、ハイウォーターマークを使用したノンブロッキング送信は望ましくありません。

ブロックしたくないので、送信のブロックは機能しません。

4

1 に答える 1

7

あなたが探しているように見えるのは、単に PUB ソケットです。このソケット タイプは、送信時にブロックされることはなく、サブスクライバーに送信できないメッセージはすべて破棄されます。このページを参照してください: http://api.zeromq.org/3-2:zmq-socket

余談ですが、このソケットを「実際の」pub/sub に使用する必要はありません。エンドポイントごとに PUB ソケットと SUB ソケットを 1 つだけ持つことで、2 つのノード間のノンブロッキング通信に使用できます。

サーバーが切断されている間に送信できなかったメッセージを PUB ソケットが破棄するため、サーバーは再接続後に「古い」メッセージを取得しません。それにもかかわらず、内部 ZMQ の「キューイング」を回避することはできませんが、ユースケースにはほとんど影響しないはずです。

于 2012-12-12T06:59:53.943 に答える