2017-03-13 2 views
7

Socket based event push architecture 私はノードJSに書かれたソケット・サーバ・アプリケーション、アマゾンEBS(弾性豆の茎)でホストされているを持っていますソケットに接続し、指定されたIDを渡します。たとえばevent_idです。私のアプリケーションは、名前が "event_ event_id"の部屋を作成し、部屋に参加します。クライアントごとにそれぞれ異なる「EVENT_ID」を持っているソケットIO、アプリケーションサーバのすべてのインスタンスに接続する必要があり、ロードバランサ</p> <p>クライアントによって管理されている

ラムダ関数は、event_idの

、必要に応じてデータをアプリケーションに「event_push」というイベントをソケットに接続し、放出するときはいつでもインスタンスのいずれかで私のソケットアプリケーション(中EBS)したがって、すべてのメンバーがイベントの通知を受け

クライアントがサーバのいずれかを接続することができ、ロードバランサによって決定されます、event_idでプッシュイベントを、それは部屋のすべてのメンバーに「event_ event_idを」プッシュデータをブロードキャスト検出し、固定セッションで接続を維持することができます

今私の問題: 「event_ event_id

Qnの名前の部屋を持つサーバーにのみ「event_push」を放出する方法があります:内のサーバーのすべてのインスタンスにイベントを放出する方法はありますEBS? または Qn:代替ソリューションはありますか?

+0

可能な解決策:イベントの詳細を受け取ることができる永続的な接続を持つことができるセントラルサブスクリプション/パブリッシュサーバー。ソケットサーバーは、イベントが発生したときに永続的な接続を介してすべての加入ソケットサーバーにプッシュされるように、中央サーバーにサブスクライブすることができます。 – Ima

答えて

0

あなたのケースでevent_event_idに関する情報を保存するために、RedisまたはmongoDbを使用することができます。あなたは、イベントがサーバーに属しているとの情報を持つことになりますですさて、これは何をするかの例のサンプルドキュメント用のデータ・ストレージに

{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 1 
}, 
{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 2 
} 

この情報を保存することができます。ここでloadbalancerがserver1の要求をサーバー2に送信し、サーバー2がその要求を認識しない場合は、サーバー間で通信チャネルを作成し(socketio、microserviceなどを使用できます)、その要求をサーバー1にリダイレクトして、イベント。

切断イベントが発生すると、mongoまたはredisからソケットIDを削除する必要があります。

+0

1.私のサーバはElastic Bean Stalkによって起動されます。どのサーバが起動していて、どのサーバが停止しているのか、または新しいサーバが初期化されたのかはわかりません。したがって、このシナリオではサーバー間の通信は問題になりません。 – Ima

+0

2.どのユーザーがどのサーバーに接続されているかはわかりません。これは、ブラウザーからサーバーへのソケット接続に関するもので、接続は永続的で、2つの理由によりクライアント(ブラウザー)は特定のサーバーへの接続を確立できません。 a)サーバーは常に稼働しているわけではなく、EBSによって管理されており、クライアント(ブラウザ)はサーバーに関する情報を持っていません。 b)接続はElastic Load Balancer(ELB)によって決定されます – Ima

+0

また、イベントはユーザーまたは他のエンティティに限定されないため、提案したとおりにバインドすることはできません。 – Ima

関連する問題