实时 Socket.IO 扩展问题 - Python

3

我正在尝试使用socket.io 0.6和tornadio来实现类似Facebook上的数据流。

每个用户在自己的主页上有自己的comet频道/组。 我向所有好友的主页发送comet消息(即使他们不在线)。

问题在于扩展:如果我有100万个好友,那么写入所有主页需要很长时间。

是否有更有效的解决方案来利用comet完成这项任务?

1个回答

2
这是社交空间中的一个难题。两种方法之间存在权衡:
- 推送(push):当用户产生事件(例如状态更新)时,将该状态更新推送到每个用户朋友的流中。当用户加载其流时,您只需要从单个位置读取记录。 - 拉取(pull):当用户产生事件时,将该事件写入用户的数据记录中。当用户加载其流时,轮询每个朋友的数据记录,并即时聚合结果。
当加载流的频率远高于用户更新且用户的粉丝数量(例如用户最大的关注者数)较少时,推送方法很好。当用户加载其流的频率较低或者用户可以关注的人数较少时,拉取方法很好。
我曾在一份关于如何有效处理此问题的论文上担任共同作者。基本上,我们使用了混合方法,根据用户统计数据来确定何时推送或拉取。
为简单起见,我建议您实现拉取模型。缓存聚合结果并在缓存条目过期一段时间后才刷新用户的feed。

我们已经为用户第一次进入页面时开发了拉取功能。现在我们需要一个高效的推送功能来实现实时更新(这样用户就不需要刷新页面了)。 - Tiago Moutinho
你只推送给当前已登录且活跃的用户吗?如果只推送给这些用户,你仍然遇到可扩展性问题吗? - jterrace
事实上,这不是一个选项,因为写信给我所有的朋友需要很长时间,如果我还要验证我的一百万个朋友是否已经登录并活跃,那将需要更长的时间。 - Tiago Moutinho
为什么不保留一个活跃用户ID列表呢?然后,如果您在内存中加载了一百万个好友用户ID,只需将其与活动集的交集取出并仅更新那些交集呢? - jterrace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接