問題タブ [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# - ZeroMQ または NetMQ で Router ソケットから送信と受信の両方を行うにはどうすればよいですか?
私はNetMQ v4でディーラー <--> ルーターをセットアップしており、どの方向でも問題なくメッセージを非同期に送受信できます。
ここで、サーバー ( Router ) が着信メッセージをリッスンする抽象化に形式化したいと思いますが、接続されたクライアント ( Dealers )にオンデマンドでメッセージをブロードキャストする必要もあります。
サブスクライバーがサーバーにもメッセージを送信する必要があるため、Pub <--> Sub ソケットの使用を避けようとしています。私が達成しようとしていることに最も近いパターンは、WebSocket クライアント サーバー通信です。
クライアント メッセージをリッスンする最初の部分は、次のように行われます。
ソケットがスレッドセーフではないことを考えると、すべてのクライアントに (オンデマンドで別のスレッドからの) メッセージをブロードキャストする方法を見つけることに行き詰まっています。
代わりにタイムアウトを設定してループ内でメソッドを使用するTryReceiveMultipartMessage
と、ブロードキャスト メッセージのキューをチェックし、そのようなメッセージを送信する各クライアントをループできます。何かのようなもの:
これは、主に次の理由により、どういうわけか正しく感じられません。
- タイムアウトの適切な値はどれですか? 1 秒、100 ミリ秒など。
- このプログラムは、毎秒数千のメッセージを送信する 10 万以上のクライアントを接続するために使用されるため、これが最も効率的でパフォーマンスの高いソリューションですか。
これに対する最善のアプローチについての指針は非常に高く評価されています。
c# - ReceiveReady で動作する NetMQ pub-sub パターンを取得できません
NetMQ (3.3.3.4) を試して、pub-sub パターンを作成しています。
ホスト/サーバーが 1 つのポート (9000) ですべての着信データをリッスンし、別のポート (9001) ですべてのクライアント/サブスクライバーにデータを転送するようにします。
その後、クライアントは 9000 でデータを送信し、9001 で (だれからも) 送信されたすべてのメッセージを受信します。
ドキュメントに従って、以下のコードのようなものを作成しましたが、動作させることができません。ReceiveReady
主に、決して呼び出されないので、私は信じています!
それがうまくいくと私が信じている方法:
client.Publish
最初の行のhost.SubscriberSocket_ReceiveReady
ブロックを解除し、データを他のソケットに渡す必要があります- データが渡さ
Task
れると、クライアントで実行されている無限に表示されるはずです
結果:
- ブレークポイントに
// This line is never reached
到達することはありません - どこにも例外はありません。
- パブリッシュ = 9000 およびサブスクライブ = 9001 になるようにホストのポートを切り替えても効果はありません
- Windows ファイアウォールがオフになっているため、ブロックされることはありません
PublisherSocket
アドレスをコンストラクターに入れている_publisherSocket.Bind(address)
か、ホストまたは_publisherSocket.Connect(address)
クライアントで使用しているかに違いはありません
私は何を間違っていますか?
ホスト
クライアント
テスター
c# - NetMQ を使用した通知付きのクライアント サーバー アプリケーション
そのような機能を備えたローカルネットワークでクライアントサーバーアプリケーションを作成する必要があります:
- 単一サーバー (データアクセスなど...)
- マルチクライアント(通常3~5、最大20)
- 各クライアントはサーバー上で承認する必要があります (クライアントが持っている権限を確認する必要があります)
- クライアントはサーバーに要求を送信し (通常は 1 Kb 未満、最大 3 ~ 5 Kb)、応答を取得します (通常は 30 ~ 100 Kb、場合によっては最大 1 ~ 2 Mb の大量のデータになる可能性があります)。
- クライアントサーバーからのいくつかのクエリがすべてのクライアントに通知し、それらに新しいデータと更新されたデータを送信した後(サーバーはクライアントがどれだけ接続されているかを知る必要があります)
- ネットワーク接続が切断された場合、クライアントは再接続する必要があります
私の目的には、Protobuf を使用した NetMQ で十分だと思います。ドキュメントを見て、各クライアントがワーカーおよびサーバー ワーカーである場合、私のタスクに最も適したパターンはhttp://zguide.zeromq.org/page:all#Service-Oriented-Reliable-Queuing-Majordomo-Patternであることがわかります。同時にクライアントです。
この解決策も複雑だと思いますか?このような問題を解決するためのより簡単な方法はありますか (より単純なパターンまたは WCF に基づくもの)?
zeromq - ZeroMQ パブリッシャー ソケット - サブスクリプションでイベントを発生させる
パブリッシャーソケットへの新しいサブスクリプションでイベントを発生させる方法があるかどうか疑問に思っていました
例えば:
もちろん、OnSubscription
実際には存在しませんが、それを回避する方法があるかどうか疑問に思っていました。
サーバーがすべてのサブスクリプションを認識する必要があります。
私はそれを実装する2つの方法について考えました:
サーバーに追加のルーター ソケットを作成します。すべてのサブスクリプションは、パブリッシャ ソケットとルーター ソケットの両方に送信されます (サブスクリプション解除も同様)。これにより、ルーターからサブスクリプションをポーリングできるようになります。
パブリッシャー/サブスクライバーをまったく使用せず、すべての pubsub メカニズムをルーター/ディーラーで作成します。
あなたは私に何をするように提案しますか?