アプリケーションのインスタンスが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とのメッセージが表示されますする状況をどのように処理するかということでしょうか?したがって、例の場合、インスタンス番号1はcustomerId=10
とウェブソケット接続を受け取りましたが、インスタンス番号2はcustomerId
のRabbitMQメッセージを取得します。その場合インスタンス番号2は関連付けられたソケットを見つけることができません。
socketStore
(customerId
はキーです)のように、同時に1人の顧客が異なるデバイス(デスクトップ、モバイル、ipadなど)でログインすることができます。デバイスごとに、例えば:
const socketStore = {
'10': [socket, socket, ..., socket]
}
このマップは、すべての参加者を「同期」する単一インスタンスを使用して、redisまたはその他の高速メモリ記憶域に保存する必要があります。 –
すべてのインスタンスがすべてのメッセージを購読するとどうなりますか?アーキテクチャを単純化します。顧客IDがソケットストアに見つからない場合、インスタンスは何もしません。 –