使用RabbitMq和websockets扩展应用程序

时间:2017-10-26 21:18:36

标签: javascript websocket socket.io rabbitmq

让我们说有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,...)登录,就像我socketStorecustomerId是关键)一样每个设备应该有一个或多个套接字对象,例如:

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

1 个答案:

答案 0 :(得分:1)

如果缩放工作加载,这会让一台服务器与客户进行交互,如果他在线,你总能找到他。这种结构将工作量转移给工人。

scaling work loads

scaling work loads

如果扩展连接,如果一个服务器无法容纳所有连接,那么您需要一个中继服务器来跟踪更高级别的用户 scaling connections

你也可以同时使用