Tornado + Redis创建多人聊天程序的问题

2013-07-23 23:48:53 +08:00
 jayn1985
这两天一直在学习Tornado框架,看了其github项目中自带的简单的基于websocket的聊天程序实现,萌生了在此基础上改写的念头,原因很简单:如果真正在生产环境使用Tornado server,一般需要开启多个tornado进程,前端可以由Nginx来负载均衡,这样的话,其demo中利用WebSocketHandler类变量(一个Set集合)来保存所有的WebSocket对象就无法满足多进程共享该数据的需求,于是想到了可以使用Redis来解决这个问题。
我的想法很简单:在Redis中维护一个哈希表,其每个域(field)为在线User的ID,域的值(value)为对应该User的WebSocket实例。但是问题出现了:每当一个新用户上线,我需要将新生成的WebSocket对象插入到Redis中去,由于需要插入的值为WebSocket对象,我该如何进行保存呢?(使用pickle序列化尝试貌似不可行,即使可以,之后反序列化出来的对象应该也不是原先的WebSocket对象了)
可能我的思路本身就有问题,所以烦请各位同学指点迷津下,多谢~
9270 次点击
所在节点    Tornado
7 条回复
Ricepig
2013-07-24 00:19:42 +08:00
虽然聊天从业务上是有状态的,但是希望底层实现时能无状态吧。

这样就不用保存websocket了,只要保证新的websocket能建立并恢复到当初的样子就好了
pubby
2013-07-24 01:32:55 +08:00
不太了解tornado,
是否可以这样架构:
1、Tornado只负责和websocket以及用户交互服务
2、写个聊天业务进程,跟那些tornado进程网络通信,并负责聊天业务处理,只要知道用户在哪个tornado 上,就命令哪个去处理。把这个当成中枢,把那些tornado当成跑腿的
saharabear
2013-07-24 01:47:55 +08:00
我用php+数据库(内存数据库)做过聊天室,压力大的情况下,不如上一些专门的聊天服务器,比如jabber或者类似的专用协议,走http.
notedit
2013-07-24 02:16:41 +08:00
两个方案:
方案一:每个进程保存一部分连接,用redis的pub/sub 来进行信息的广播
方案二:在redis里面保存连接的文件描述符(int), 进行广播的时候 通过文件描述符生成链接对象
jayn1985
2013-07-24 09:42:23 +08:00
@notedit 第一个方案也想过,不过没深入往那边去考虑;就我自己提的那个方案,你的第二个方案倒是给了我一些启发,多谢指导:)
jayn1985
2013-07-24 09:43:54 +08:00
@saharabear 感谢你的回复,我只是想写个程序玩玩,还没到服务器压力巨大的那个地步:)
yetone
2013-09-24 17:31:33 +08:00
@jayn1985 你好,请问你的问题解决了吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/76765

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX