实现可扩展的多房间聊天系统

时间:2013-08-22 14:35:26

标签: html5 websocket tornado sockjs

我最近一直在研究sockjs-tornado,正在为社交网站开发聊天功能。我试图了解用于构建可扩展多房间聊天功能的常用方法。我将概述我想到的几种方法,并希望获得反馈。现实世界中使用了哪些方法?这些方法有哪些优点和缺点?

Prereqs:

  • 跑龙卷风
  • 使用sockjs-tornado lib
  • ssjs-client lib for js

其他一切都是开放的。

我考虑过的方法:

For loop

这似乎是最简单的方法。您创建一个订阅某些房间类的用户类。用户发送包含房间ID的消息类,服务器仅将循环中的消息重定向到已订阅该房间的用户。在我看来,这似乎是最糟糕的,因为复杂性显然至少是线性的。 (想象一下,500个用户一次连接到5个聊天室。)

多任务/多服务器实例

这似乎也是一个坏主意,因为你可以随时在...不同的端口上运行500个服务器实例?我真的不确定这个方法的实现。

原生支持

现在已经获得批准,很多库都内置了socketio。但是由于唯一的node.js支持,这不是一个选项。 (我在龙卷风服务器上。)特别是袜子没有内置支持多个“房间”。

结论

我正在寻找资源/案例研究和行业标准。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我只会使用像RabbitMQ这样的邮件队列服务器和扇出交换作为每个“聊天室”。 您可以在Python here中看到使用扇出交换的示例。 Pika AMQP库也与Tornado合作。

使用消息排队系统的优点是,您可以让用户连接到不同服务器上的不同Tornado进程,同时仍然位于同一“房间”,从而在HTTP层上提供高可用性。 RabbitMQ还具有HA功能(尽管不是最好的)。