2

さて、スケーラビリティの高いサーバーの作成に関する多くの質問を読みましたが、実際に良い答えに出くわすことはありませんでした. とにかく、大量のデータと接続を処理する、拡張性の高いクライアントを作成したいと考えています。私が作成したのは、次のような SocketAsyncEventArgs と C#5 async/await を使用する単純なクライアントです。

public async Task<int> SendAsync(byte[] buffer, int offset, int size)
{
    var socketArgs = new SocketAsyncEventArgs();
    var tcs = new TaskCompletionSource<int>();

    socketArgs.SetBuffer(buffer, offset, size);
    socketArgs.Completed += (sender, args) =>
    {
        tcs.SetResult(socketArgs.BytesTransferred);
        LastSocketError = socketArgs.SocketError;
    };

    if (_clientSocket.SendAsync(socketArgs)) 
        return await tcs.Task;

    LastSocketError = socketArgs.SocketError;
    return socketArgs.BytesTransferred;
}

ConnectAsync、ReceiveAsync、AcceptAsync についても同様です。これはクライアント部分ではうまく機能しますが、私のサーバーではそれを正しく行う方法がわかりません..(受信するクライアントごとにスレッドを作成することになります.)APM(開始/終了)またはEventHandler を使用していますが、それは async/await を使用する目的を殺し、最終的にはすべての呼び出しに対して新しい SocketAsyncEventArgs を作成するときにメモリ効率が良くありません。(ConcurrentBag を使用して) プールを作成しようとしましたが、TaskCompletionSource を何度も作成する必要がありました (一度しか使用できないため)。

だから私はこれを作成するのは良い考えではないと思いますが、私はそれが本当に好きです.. 高スケーラブルで高性能なサーバーを作成するための良い設計は何ですか?

4

1 に答える 1