より大規模な監視およびデータ収集システム用に ZeroMQ を評価しようとしています。小規模ではすべてうまく機能しますが、負荷とスケールを少し上げるのは難しいようです。
現在、C# ラッパー (clrzmq、3.0.0-rc1) を使用して、パブリッシャー アプリケーションとサブスクライバー アプリケーションの両方を作成しています。パブリッシャー ソケット (ソケット 1 つ、コンテキスト 1 つ) を 1000 のエンドポイント (ローカルホスト + ポートの範囲) にバインドし、サブスクライバー アプリケーション ソケット (ソケット 1 つ、コンテキスト 1 つ) をパブリッシャー エンドポイントにバインドします。
これは機能する場合もあれば、機能しない場合もあります (プロセスによって処理されるソケットの最大数に関係していると思います)。アプリケーションを起動する順序に依存しているようですが、確かなことはわかりません。私が見る唯一のものは、詳細がまったく含まれていない厄介な SEHExceptions です。単純なコンソール アプリケーションを作成すると、次のような低レベルの C++ アサートが表示されることがあります。
- アサーションに失敗しました: fds.size () <= FD_SETSIZE (......\src\select.cpp:70)
- アサーションに失敗しました: 権限が拒否されました (......\src\signaler.cpp:281)
- アサーションに失敗しました: ピアによって接続がリセットされました (......\src\signaler.cpp:124)
私にはあまり役に立ちません。C# ラッパーでは、コンテキストの作成が失敗します。ソケットへの接続やソケットの作成を開始する機会すらありません。低レベルの ZeroMQ エラーは例外をスローすることで処理されることを期待していますが、エラーの処理方法をまだ理解していないだけかもしれません。
私が今持っている質問は次のとおりです。
- すべて C# を使用して、単一のマシン (実際には 1 つのパブリッシャー = 1 マシン) 上の 1000 の個別のパブリッシャーと別のマシン上のいくつかのサブスクライバーをシミュレートする (ある程度) 現実的なテスト セットアップを作成するにはどうすればよいですか。それは可能ですか?
- さらに重要なことは、C# コードで ZeroMQ エラーをトラップして、何が問題なのかを理解できるようにするにはどうすればよいでしょうか?
ZeroMQ はかなり安定していて成熟しているように見えるので、1000 のパブリッシャーを処理するのが問題になるとは思えません。ただし、C# で ZeroMQ を使用するには、現在利用可能なものよりも優れたエラー サポートが必要です (ここで何かを完全に見逃していない限り)。
アップデート:
ソースを掘り下げた後、私zmq_assert(...)
はRaiseException (0x40000015, EXCEPTION_NONCONTINUABLE, 1, extra_info);
. これにより、元の assert ステートメントがコンソールにダンプされた後、アプリケーションが突然終了します。これは少し厳しいように思えますが、実際には回復不可能であることを考えると、最良の選択肢かもしれません。ただし、多少優れたエラー メッセージが表示されても問題はありません。誰もが意味を知っているわけではありませんfds.size () <= FD_SETSIZE
。ソースのコメントはいくつかの手がかりを与えてくれます。エラー メッセージにそのコメントがあるといいでしょう。とにかく、私のアプリケーションがコンソール アプリではないことを考えると、未処理の SEHException が残ります。これには、アサート ステートメントや行/ファイル情報さえ含まれていないようです。他の同様の不可解なエラーを引き起こすバグを他にいくつ作成するのだろうか.