質問

私の C# クラスは、TCP ストリーム スタイルのソケット接続を介して受信した大量のイベントを処理できなければなりません。クラスのソケットが TCP サーバーから受信するイベント メッセージの量は完全に変動します。たとえば、10 秒間に 1 つのイベント メッセージだけを受信する場合もあれば、1 秒以内に 60 のイベント メッセージを受信する場合もあります。

Socket.ReceiveAsync を使用してメッセージを受信して​​います。ReceiveAsync は、受信操作が保留中の場合は true を返し、回線上にデータが既に存在し、受信操作が同期的に完了した場合は false を返します。操作が保留中の場合、ソケットは IO 完了スレッドでコールバックを呼び出します。そうでない場合は、現在の (IOC) スレッドで独自のコールバックを呼び出します。さらに、イベント メッセージに混じって、この TCP サーバーに送信されたコマンドに対する応答も受信します。応答メッセージはすぐに処理されます。スレッドプール ワーカーを起動することで個別に実行できます。

ただし、イベント メッセージが「十分」 (N) になるまで、またはネットワーク上にメッセージがなくなるまでイベント メッセージをキューに入れてから、スレッドプール ワーカーを起動してイベント メッセージのバッチを処理したいと考えています。また、すべてのイベントを順番に処理したいので、一度に 1 つのスレッドプール ワーカーのみがこれを処理できるようにしたいと考えています。

イベント メッセージのプロセッサは、メッセージ バッファをオブジェクトにコピーし、イベントを発生させ、メッセージ バッファを解放してリング バッファ プールに戻すだけで済みます。そこで私の質問は...これを達成するための最良の戦略は何だと思いますか?

さらに詳しい情報が必要ですか?お知らせ下さい。ありがとう!!

役に立ちましたか?

解決

1 秒あたり 60 のイベントを大容量とは言えません。このような低レベルのアクティビティでは、どのようなソケット処理方法でも問題ありません。現在のマシンよりもはるかに能力の低いハードウェアを使用し、select を使用するだけで、単一スレッドで 1 秒あたり 5,000 件のイベントを処理しました。

規模を拡大したい場合、スレッド間でメッセージを個別に受け渡すことは大惨事になるでしょう。バッチ処理する必要があります。そうしないとコンテキスト スイッチがパフォーマンスを低下させます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top