さて、スケーラビリティの高いサーバーの作成に関する多くの質問を読みましたが、実際に良い答えに出くわすことはありませんでした. とにかく、大量のデータと接続を処理する、拡張性の高いクライアントを作成したいと考えています。私が作成したのは、次のような 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 を何度も作成する必要がありました (一度しか使用できないため)。
だから私はこれを作成するのは良い考えではないと思いますが、私はそれが本当に好きです.. 高スケーラブルで高性能なサーバーを作成するための良い設計は何ですか?