EC2インスタンス(Amazon Auto ScalingとElastic Load Balancingと併用)を使用して、Amazon Web Servicesで動作するTCPサーバのインスタンスがいくつかあります。各EC2インスタンスは、(Amazon RDS上で実行される)集中データベースにアクセスできます。このバックエンドをスケーラブルにするために、(TCPサーバーの)新しいEC2インスタンスは、要求に応じて拡大縮小されます。EC2インスタンス上のTCPサーバをスケーリングする分散問題
サーバーはPython Twistedフレームワークを使用して作成されています。このシステムは、ユーザーが参加できる複数のグループチャットを使用して、カスタムインスタントメッセージングサービスを強化します。
ユーザーがサービスの使用を開始すると、TCPサーバーの1つにTCPソケットが確立されます。各サーバは、現在接続されているユーザ(即ち、開いているTCPソケット)と、各ユーザが現在「入っている」(従って加入している)「グループチャット」をメモリに記憶する。作成されたすべてのチャットデータはデータベースに保存されます。
問題は
ユーザーAがGroupChatZにメッセージをポスト、すべてのユーザーの中に "GroupChatZは、メッセージが表示されます。これは、1つのTCPサーバーしかない場合は簡単です。「グループチャット」内のすべてのユーザーのメモリを検索し、新しいメッセージを送信します。しかし、複数のサーバがあるので、新しいメッセージが作成されるとき、そのサーバがメッセージを他のすべてのサーバ(すなわちEC2インスタンス)に渡す必要があります。
この問題を解決する最も効率的な方法は何ですか? AWSコンポーネントを使用している可能性があります。私は考えることができる
一つの解決策は、それが最初の起動時に、データベースにそのIPアドレスを保存し、他のすべての接続されているサーバのIPアドレスを取得し、それらとのTCP接続をセットアップするために、各サーバー用です。新しいメッセージが受信されるたびに、それを処理するサーバーは、それが接続されている他のすべてのサーバーにメッセージを送信できます。
しかし、TCP接続は100%信頼性がなく、このソリューションは複雑さを増します。私はシンプルな加入者パブリッシャタイプのメカニズムを実装するためにいくつかのAmazon Web Servicesコンポーネントを使用するための良い方法は、実際にそこにある疑いがある
(オブザーバー・デザイン・パターンを考えます)。私。あるサーバーが何かを追加して、他のすべてのサーバーがそのサーバーからメッセージをリアルタイムで取得します。
クイックアップデート、私はちょうどAmazon SNSを使い始め、Twistedサーバーが購読するトピックを作成し始めました。これまでのところ、結果は有望に見えます。 –