Redis Pub / Sub Scaling

时间:2015-09-19 08:30:20

标签: node.js redis

我一直在重写我的nodejs游戏应用来从redis读取内存,所以如果它变得越来越大,我最终可以扩展它。但是,我停了下来因为我觉得我的方式错了。例如:

enter image description here

Server 1位于9300端口

Server 2位于端口9301

现在,让我们说Server 1的玩家希望向private message上的玩家发送Server 2

我目前做什么

Server 2会向redis发送一个发布信号,Server 1也会捕获该信号,如果该用户在该服务器上,它会向他们发送通知以及消息。< / p>

一些问题

1)Server 2Server 1发送邮件而不发布到redis

2)Server 2没有跟踪Server 1拥有的所有已连接客户端,因此无法实现。{1}}除非,我会跟踪每台服务器上的所有连接客户端吗?这将要求客户端在每次访问时连接到多个服务器。

3)我们说我有10台服务器。 Server 5上的用户想要在Server 1上向用户发送私信。如果我通过redis发送了一个发布信号,Servers 4,6,7,8,9,2,3也将收到该信号......这是不需要的?这是Peer to Peer连接发挥作用的时候吗?或者是缩放所需的额外带宽以及我过度思考所有内容?

1 个答案:

答案 0 :(得分:2)

也许您可以通过添加RabbitMQ而不是redis pub / sub来更改应用程序的概念。 RMQ允许更智能的消息路由。

基本上每个用户都可以收听自己的消息:

  • 用户连接到服务器(1-x)
  • 服务器使用用户路由密钥订阅RMQ交换消息
  • 当用户发布私人消息时,它会被发送到提供的具有特定用户路由密钥的交换

如果您获得大量用户,那么这个概念仍会达到极限。 RMQ服务器的连接数将增加。在这种情况下,您可以缩放RMQ或更改连接概念:

  • 将所有用户连接信息保存到redis
  • 当用户向其他用户发送私人消息时,首先找到哪个服务器实例用户
  • 仅向特定服务器实例发送消息(从用户连接信息中提取)