問題タブ [netmq]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - NetMQ - メッセージは着信メッセージへの返信でのみ機能し、他のポートへの返信では機能しません
ルーター アプリケーションの初期化時に、次のコードを呼び出します。正常にバインドし、正常にメッセージを受信しますが、直接応答でない限り、On_ReceiveXXX メソッドの動作を拒否します。理由を知りたい
これは、ディーラーの ReceiveReady イベントの呼び出しに失敗します。
private void On_ReceiveFrontEnd(オブジェクト送信者, NetMQSocketEventArgs e) { _lastPingResponse = DateTime.Now; var frontEndMsg = e.Socket.ReceiveMultipartBytes(); var streamData = frontEndMsg.Last(); ApplicationMessage msg = PackageHelper.DeserializeOutgoing(streamData); Console.WriteLine(string.Format("受信したコマンド: {0}", msg.CO));
しかし、行を変更すると
に
それは突然機能します...したがって、フロントエンドアプリケーションからのメッセージは応答することしかできず、バックエンドアプリケーションには渡されません。バックエンド メッセージについては、逆の場合も同様です。
c# - 複数のスレッドから NetMQ ソケットにアクセスする
NetMQ
複数のスレッドが同時に使用していない限り、複数のスレッドからソケットにアクセスしても安全ですか?
たとえば
、次のシナリオは問題ありませんか。
- スレッド
A
はソケットを使用します。 - スレッド
A
が終了します。 - スレッド
B
は同じソケットを使用します。
そうでない場合
、唯一の操作スレッドは、ソケットを作成したのとまったく同じでなければなりませんか?
c# - NetMQ ポーラーを使用してメッセージを送信できますか?
これが私のシナリオです:
- 1 つのアプリケーションで複数のソケット
- これらのソケットの任意の数で送受信したい
スレッドの問題と奇妙な例外を回避するためにこれまでに見つけた唯一の解決策は次のとおりです。
- 各ソケットには独自のスレッドがあります
- 各ソケットには、送信するメッセージがあるかどうかを常にチェックする独自の同時キューがあります。
- スレッドに関係なく、特定のソケットから送信するには、メッセージを正しいソケット同時キューに追加するだけです
ただし、この取得にはかなりのコストがかかります。私は一般的にスレッドの大ファンではなく、もっと良い方法があると感じています。私はポーラーについて考えています - ソケットごとに新しいスレッドを作成する必要なく、複数のソケットから受け取ることができます (私の知る限り)。これが正しい場合、保留中のメッセージを送信する方法はありませんか?
それ以外の場合、複数のスレッドが私の唯一のオプションですか? ありがとう
zeromq - HWM に達すると NetMQ PUSH ソケットが無期限にブロックされる
.NET 4.5 で NetMQ (Nuget 3.3.2.2) を使用しており、PUSH ソケットを使用する単一の高速ジェネレーター プロセスと、PULL ソケットを使用する単一の低速コンシューマー プロセスがあります。送信側 HWM に到達するのに十分な数のメッセージを送信すると、送信側プロセスはスレッドを無期限にブロックします。
問題を説明するいくつかの不自然な(ジェネレーター)コード:
私の構成では、これは通常、約 5000 または 6000 のメッセージを送信したことを報告し、その後単純にブロックします。送信 HWM セットを大きな値 (または 0) に設定すると、期待どおりにすべてのメッセージが送信されます。
ここでは、再試行する前に別のコマンドを受信するのを待っているようです: (SocketBase.TrySend)
私が 0MQ ガイドで読んだことから、完全な PUSH ソケットでのブロックは正しい動作です (そして私がやりたいことです) が、消費者がそのキューをクリアすると回復することが期待されます。
ある種の TrySend パターンを使用して自分でブロックを処理する以外に、PUSH ソケットにブロックされたメッセージを定期的に再送信させるために設定できるオプションやその他の機能はありますか?
c# - NetMq ソケットはスレッドセーフですか?
プライベート フィールドを使用します ( PushSocket
- zmq_push socket for netmq )
そして、このソケットを異なるスレッドで使用する2つの方法
lock
または別の同期プリミティブを使用する必要がありますか?
zeromq - PULL ソケットが接続されていない場合、0MQ PUSH/PULL の順序付けが壊れています
私は(Python->C#) にSocket と Socket を 1 つだけ持つPUSH/PULL
パターンを持っています。両方が接続されている限り、ワーカーがメッセージを処理するのにどれだけ時間がかかっても、キューに入れられたメッセージの順序は保持されます。0MQ
PUSH
PULL
問題は、ワーカーがしばらく切断されてから再接続した場合、この期間にキューに入れられたすべてのメッセージが、PUSH
Socket によってキューに入れられた方法に関係なく、ランダムな順序で到着することです。この問題の組み込みの解決策はありますか、それともより高度なパターンを使用する必要がありますか?
PULL 側にコードを追加します。