实时Socket.IO扩展问题 - python

3 投票
1 回答
548 浏览
提问于 2025-04-17 03:12

我想做一个类似于Facebook上的动态消息流的功能,使用的是socket.io 0.6和tornadio。

每个用户在自己的墙上都有一个独立的comet频道/组。我正在给我所有朋友的墙发送comet消息(即使他们不在线也能收到)。

现在的问题是关于扩展性:如果我有100万个朋友,那要给每个人的墙上写消息就会花费很长时间。

有没有更高效的办法来使用comet实现这个功能呢?

1 个回答

2

这是一个在社交网络中比较复杂的问题。这里有两种方法可以选择:

  • 推送(push): 当用户发布一个事件(比如状态更新)时,你把这个状态更新推送给每个用户的朋友。当用户查看自己的动态时,只需要从一个地方读取记录。
  • 拉取(pull): 当用户发布一个事件时,你把这个事件写入用户的数据记录中。当用户查看自己的动态时,你需要去每个朋友的数据记录中获取信息,然后实时汇总结果。

推送方法适合于用户查看动态的频率远高于用户更新的频率,并且用户的“粉丝数”(比如一个用户最多能有多少个关注者)比较少的情况。拉取方法适合于用户查看动态的频率很低,或者用户能关注的人数比较少的情况。

我曾经和人一起写过一篇关于如何高效实现这个功能的论文。基本上,我们使用了一种混合的方法,根据用户的统计数据来决定是推送还是拉取。

为了简单起见,我建议你实现拉取模型。可以缓存汇总的结果,只有在缓存过期一段时间后再更新用户的动态。

撰写回答