让我们说有3个应用程序实例,一端是aplication接受Web套接字连接,另一端是作为消费者连接到RabbitMq。
每次创建新的Web套接字连接时,socket
都保存在JS对象中并映射到customerId
,当应用程序即将协议从HTTP切换到WS时,这可从初始HTTP握手请求中获得
const socketStore = {}
io.on('connect', socket => {
...
socketStore[customerId] = socket
})
另一方面,每条RabbitMQ消息中都会包含customerId
消息,用于查找相应的socket
对象。
onNewMessage = message => {
/**
* Consumer parse the message and take customerId
* and find a socket based on it
*/
socketStore[customerId].emit(...)
}
棘手的部分是如何处理来自任何应用程序实例的RabbitMQ使用者将收到带有customer {1 socketStore
无法找到的消息的情况?因此,对于该示例,实例编号1 与customerId=10
接收了Web套接字连接,但实例编号2 获取具有该customerId
的RabbitMQ消息。在这种情况下,实例编号2 无法找到关联的套接字。
此外,单个客户可以同时使用不同的设备(桌面设备,移动设备,ipad,...)登录,就像我socketStore
(customerId
是关键)一样每个设备应该有一个或多个套接字对象,例如:
const socketStore = {
'10': [socket, socket, ..., socket]
}