4

PULL ソケットを介して着信メッセージを受信する (Python/pyzmq)) ZeroMQ サーバーを開発しています。

ここで、サーバーを完全に再起動してアップグレードする場合があります。私の質問は; 再起動してもメッセージが失われないように、(PULL ソケットで) 着信メッセージの受信を何らかの方法で停止できますか? close()ソケットを呼び出してからrecv()、最後のメッセージを ing するようなことを考えています。おそらく、最高水準点をゼロに設定すると、同様の結果が得られます。

上記の解決策のいずれも機能しない場合は、ソケットを REP ソケットに変換し、各メッセージを 1 つずつフェッチして、毎回 ACK:ing する方がよいかもしれません。これは同期であるため、これは遅くなると思います。

4

2 に答える 2

4

はい、0mq はそのようなタイプの信頼できる配信自体を提供しません。確かに ACK でスキームを使用する必要があります。

第 4 章 - zguide の信頼できる要求と応答を参照してください。

于 2012-11-05T12:27:36.380 に答える
1

ZMQ 3.2.2 で clrzmq を使用しており、PULL ソケットに次のプロパティを設定することで上記の機能を取得しました。

  1. プルソケットの受信最高水準点を、メモリに保持したいメッセージの数に設定します。
  2. バッファ サイズを適切なサイズに設定します。
  3. メッセージを受信したくない場合は、受信チャネルで socket.disconnect() を呼び出します。

切断後、チャネルは新しいメッセージを取得しなくなります。送信者側で最高水位標を設定すると、メッセージが送信者キューに保持され始めます (イベントが失われないようにするため)。

チャネルが切断されると、受信側キューにメッセージがある間、受信イベントの呼び出しは成功します。私はタイムアウト付きの受信を使用しているため、タイムアウト後に失敗した場合、チャネルが切断されたときにキューが空であると想定しているため、チャネルを破棄してサービスを再起動できます。サービスがバックアップされると、送信者キューに保存されているすべてのメッセージがディスパッチされます。

于 2014-03-31T13:34:00.990 に答える