实时Socket.IO扩展问题 - python
我想做一个类似于Facebook上的动态消息流的功能,使用的是socket.io 0.6和tornadio。
每个用户在自己的墙上都有一个独立的comet频道/组。我正在给我所有朋友的墙发送comet消息(即使他们不在线也能收到)。
现在的问题是关于扩展性:如果我有100万个朋友,那要给每个人的墙上写消息就会花费很长时间。
有没有更高效的办法来使用comet实现这个功能呢?
1 个回答
2
这是一个在社交网络中比较复杂的问题。这里有两种方法可以选择:
- 推送(push): 当用户发布一个事件(比如状态更新)时,你把这个状态更新推送给每个用户的朋友。当用户查看自己的动态时,只需要从一个地方读取记录。
- 拉取(pull): 当用户发布一个事件时,你把这个事件写入用户的数据记录中。当用户查看自己的动态时,你需要去每个朋友的数据记录中获取信息,然后实时汇总结果。
推送方法适合于用户查看动态的频率远高于用户更新的频率,并且用户的“粉丝数”(比如一个用户最多能有多少个关注者)比较少的情况。拉取方法适合于用户查看动态的频率很低,或者用户能关注的人数比较少的情况。
我曾经和人一起写过一篇关于如何高效实现这个功能的论文。基本上,我们使用了一种混合的方法,根据用户的统计数据来决定是推送还是拉取。
为了简单起见,我建议你实现拉取模型。可以缓存汇总的结果,只有在缓存过期一段时间后再更新用户的动态。