現在、コントローラー ノード プロセスと多数のワーカー ノード プロセスがあります。
現状では、クライアントは接続先のワーカーをランダムに選択します。コントローラーは、カスタムのメモリ内クエリ可能なデータ構造を格納するためのキャッシュ レイヤーとして存在します。ワーカーは、websocket プロトコルを介してコントローラーに接続します (メッセージの断片化/可変サイズのメッセージを処理するため)。
これを拡張して、ワーカーがハートビート (負荷分散を容易にするための使用状況統計を含む) を送信し、メッセージ (サポート用) をログに記録するようにしたいと考えています。コントローラーは統計を使用して、接続するサーバーをクライアントに通知し、ログ メッセージをデータベースに書き込み、サポートのためにクエリ可能にします。
ただし、websockets は TCP で構築されているため、この種のことを行うのに最適なプロトコルではない可能性があり、これには UDP を使用する方がよいと考えています。メッセージがネットワーク上の最小 MTU (1 つのデータグラム) を下回っている限り、TCP の場合のようにメッセージの分割について心配する必要はありません...(間違っている可能性があります) !)
明らかに、コントローラーのキャッシュ部分に UDP を使用することはできません。これは、TCP と Websocket が提供する信頼性が必要になるためです。したがって、ハートビート/ロギング用とキャッシュ側用の 2 つの接続を使用するか、UDP を使用してキャッシュ リクエスト用のある種の信頼性レイヤーを実装することができます。
おそらくもっと単純なので、ここでは2つの接続が最適だと思いますが、別のスレッドでUDPハートビート/ロギングを行い、メインスレッドへのコールバックを作成して、接続するクライアントを更新することをお勧めします...
それは理にかなっていますか?Nodeでも可能ですか?モジュールは、イベントを報告するためにメイン スレッドへのコールバックを行うこれらの非同期呼び出しをどのように処理しますか?