4

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

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

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

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

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

4

1 に答える 1

5

1 秒あたり 60 のイベントを大音量とは呼びません。その低レベルのアクティビティでは、どのソケット処理メソッドでも問題ありません。select を使用するだけで、現在のマシンよりもはるかに能力の低いハードウェアを使用して、1 つのスレッドで 1 秒あたり 5,000 のイベントを処理しました。

スケーリングを検討している場合、スレッド間でメッセージを個別に受け渡すのは大変なことです。バッチ処理を行う必要があります。そうしないと、コンテキスト スイッチによってパフォーマンスが低下します。

于 2008-09-19T04:38:26.410 に答える