首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tornado Documentation
http://www.v2ex.com/tornado/
Tornado on GitHub
https://github.com/facebook/tornado/
Tornado Gists
http://tornadogists.org/
V2EX  ›  Tornado

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

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

    这样就不用保存websocket了,只要保证新的websocket能建立并恢复到当初的样子就好了
        2
    pubby   2013-07-24 01:32:55 +08:00 via Android
    不太了解tornado,
    是否可以这样架构:
    1、Tornado只负责和websocket以及用户交互服务
    2、写个聊天业务进程,跟那些tornado进程网络通信,并负责聊天业务处理,只要知道用户在哪个tornado 上,就命令哪个去处理。把这个当成中枢,把那些tornado当成跑腿的
        3
    saharabear   2013-07-24 01:47:55 +08:00
    我用php+数据库(内存数据库)做过聊天室,压力大的情况下,不如上一些专门的聊天服务器,比如jabber或者类似的专用协议,走http.
        4
    notedit   2013-07-24 02:16:41 +08:00   ♥ 1
    两个方案:
    方案一:每个进程保存一部分连接,用redis的pub/sub 来进行信息的广播
    方案二:在redis里面保存连接的文件描述符(int), 进行广播的时候 通过文件描述符生成链接对象
        5
    jayn1985   2013-07-24 09:42:23 +08:00
    @notedit 第一个方案也想过,不过没深入往那边去考虑;就我自己提的那个方案,你的第二个方案倒是给了我一些启发,多谢指导:)
        6
    jayn1985   2013-07-24 09:43:54 +08:00
    @saharabear 感谢你的回复,我只是想写个程序玩玩,还没到服务器压力巨大的那个地步:)
        7
    yetone   2013-09-24 17:31:33 +08:00
    @jayn1985 你好,请问你的问题解决了吗?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   941 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 19:45 · PVG 03:45 · LAX 12:45 · JFK 15:45
    ♥ Do have faith in what you're doing.