web-dev-qa-db-ja.com

TCP / IPソケットサーバーアプリケーションのスケーリング

クライアントサーバーの通信にTCP/IPソケットを利用してアプリケーションをスケーリングする方法を理解しようとしています。たとえば、以下の簡単な図で:

        +------------+
        | Server     |
        +------------+
           |      |
           |      |
           |tcp/ip|
           |socket|
          connections 
           |      |
           |      |
+------------+  +------------+
| Client_001 |  | Client_002 |
+------------+  +------------+

2つのクライアントが1つのサーバーに接続しています。アクションを実行し、その結果をサーバーに接続されているすべてのクライアントに送信できます。これは完全に理にかなっています。ただし、そのようなロードバランサーの背後に追加のアプリケーションサーバーを導入する場合は、次のようになります。

+------------+  +------------+
| server_001 |  | server_002 |
+------------+  +------------+
          |       |
          |       |
        +------------+
        | HAProxy    |
        +------------+
           |      |
           |      |
           |tcp/ip|
           |socket|
          connections 
           |      |
           |      |
+------------+  +------------+
| Client_001 |  | Client_002 |
+------------+  +------------+

クライアントはロードバランサーに接続します。ロードバランサは、2つのアプリケーションサーバーのいずれかに接続を委任します。

Client_001がプログラムを実行し、ロードバランサーがそれらをserver_001に接続するとします。次にclient_002がプログラムを実行し、ロードバランサーがそれらをserver_002に接続します。

server_001はclient_001に代わってアクションを実行し、接続されているすべてのクライアントに応答を送信します。ただし、client_002はserver_002に接続されているため、応答を受け取りません。

これが私の質問につながります:ロードバランサーを介して接続されているサーバーに関係なく、接続されているすべてのクライアントに応答を送信するにはどうすればよいですか?

3
nullReference

分散パブ/サブフレームワークを確認することをお勧めします。フレームワークを使用する代わりに、TCP/IPを使用して自分で実装することを決定した場合でも、それらのアーキテクチャはインスピレーションを提供するはずです。 ZeroMQ はこの使用例を処理し、 Redis も処理します。

ZeroMQがpub/sub here を処理する方法について読むことができます。

Redisは データセットのシャーディング によってチャンクに分散します。各Redisサーバーはシャードを担当します。クライアントがシャード間で均等に分散されるようにシャードを設計しようとします。

あなたが持つことができます server_001 に接続します server_002クライアントとして、メッセージを受信すると、接続されているすべてのクライアントにメッセージをリレーできます。

3
Samuel