より大きなプロジェクトの一部であるTCPサーバーを実装しようとしています。基本的に、サーバーは任意の数のクライアント(32以上)とのTCP接続を維持し、サービスを要求するすべてのクライアントにサービスを提供できる必要があります。私たちのシナリオでは、クライアントがサーバーに接続されると、何らかの障害が発生しない限り(たとえば、クライアントを実行しているマシンが故障した場合)、接続を閉じることはなく、サービスを繰り返し要求すると想定されます。サーバー。他のすべてのクライアントの場合も同じです。つまり、それぞれがサーバーとの接続を維持し、トランザクションを実行します。
今、私は上記の機能を使用して実装しましたselect()
berkelyソケットAPIのシステムコール。クライアントの数が少ない場合(たとえば10)は正常に機能します。ただし、16コアのマシンにサーバーを実装しているため、サーバーを可能な限り高いレベルにスケーリングする必要があります。そのために、私はさまざまなマルチスレッド設計手法(たとえば、クライアントごとに1つのスレッドなど)を調べました。私の意見では、スレッドプールの設計が最適です。実装しようとしたときに、いくつかの問題が発生しました。メインスレッドを指定して、任意の数の着信接続を受け入れ、各接続のファイル記述子をデータ構造に保存し、スレッドのプールがある場合、どのように取得しますか特定のクライアントがサービスを要求しているかどうかをポーリングするスレッド。設計は、クライアントがサーバーに接続し、サービスを取得した後に接続を閉じて、プールからスレッドを選択し、クライアントにサービスを提供してから、将来の接続処理のためにプールにプッシュするというシナリオでは十分に単純です。しかし、接続を維持し、サービスを断続的に要求する一連のクライアントにサービスを提供する必要がある場合、これを行うための最良のアプローチは何でしょうか。私は本当にこれで立ち往生しているので、すべての助けは大いに感謝されます。ありがとう。