2017-10-26 2 views
2

アプリケーションのインスタンスが3つあり、一方のアプリケーションはWebソケット接続を受け入れ、他方は消費者としてRabbitMqに接続されているとします。RabbitMqとウェブソケットを使用したアプリケーションのスケーリング

新しいウェブソケット接続が作成されるたびに、socketがJSオブジェクトに保存され、customerIdにマッピングされます。これは、HTTPからWSへのプロトコルの切り替えが開始されたときの最初のHTTPハンドシェイク要求から利用できます。他端に

const socketStore = {} 
io.on('connect', socket => { 
    ... 
    socketStore[customerId] = socket 
}) 

、すべてのRabbitMQメッセージが適切なsocketオブジェクトを見つけるために使用されるだけでなく、それにcustomerIdを有するであろう。

onNewMessage = message => { 
    /** 
    * Consumer parse the message and take customerId 
    * and find a socket based on it 
    */ 
    socketStore[customerId].emit(...) 
} 

トリッキーな部分は、どんなアプリケーションインスタンスからのRabbitMQ消費者がsocketStoreで見つけることカントはcustomerIdとのメッセージが表示されますする状況をどのように処理するかということでしょうか?したがって、例の場合、インスタンス番号1customerId=10とウェブソケット接続を受け取りましたが、インスタンス番号2customerIdのRabbitMQメッセージを取得します。その場合インスタンス番号2は関連付けられたソケットを見つけることができません。

socketStorecustomerIdはキーです)のように、同時に1人の顧客が異なるデバイス(デスクトップ、モバイル、ipadなど)でログインすることができます。デバイスごとに、例えば:

const socketStore = { 
    '10': [socket, socket, ..., socket] 
} 
+0

このマップは、すべての参加者を「同期」する単一インスタンスを使用して、redisまたはその他の高速メモリ記憶域に保存する必要があります。 –

+0

すべてのインスタンスがすべてのメッセージを購読するとどうなりますか?アーキテクチャを単純化します。顧客IDがソケットストアに見つからない場合、インスタンスは何もしません。 –

答えて

1

作業負荷をスケーリング場合、これは彼がオンラインになっている場合は、常に彼を見つけることができ、顧客と対話するために一つのサーバを維持します。この構造は作業負荷を作業者にシフトさせます。

scaling work loads

scaling work loads

つのサーバーがすべての接続を保持することができない場合は、スケーリングの接続は、その後、あなたはより高いレベル scaling connections

でユーザーを追跡するために、リレーサーバが必要な場合も、あなたは、両方の

を使用することができます
関連する問題