实时Socket.IO缩放问题-python

实时Socket.IO缩放问题-python,python,real-time,socket.io,tornado,Python,Real Time,Socket.io,Tornado,我正在尝试做一些类似Facebook上的流的事情,使用socket.io 0.6和tornadio 每个用户的墙上都有自己的comet频道/组。 我正在向我所有的朋友(即使他们不在线)发送comet消息 问题在于伸缩性:如果我有一百万个朋友怎么办?在所有的墙上写字要花很长时间 使用comet有没有更有效的解决方案?这是社交领域的一个难题。两种方法之间存在权衡: 推送:当用户生成事件(例如状态更新)时,您将该状态更新推送到每个用户的好友流中。当用户加载其流时,您只需从单个位置读取记录 pull:

我正在尝试做一些类似Facebook上的流的事情,使用socket.io 0.6和tornadio

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

问题在于伸缩性:如果我有一百万个朋友怎么办?在所有的墙上写字要花很长时间


使用comet有没有更有效的解决方案?

这是社交领域的一个难题。两种方法之间存在权衡:

  • 推送:当用户生成事件(例如状态更新)时,您将该状态更新推送到每个用户的好友流中。当用户加载其流时,您只需从单个位置读取记录
  • pull:当用户生成事件时,您甚至会将其写入用户的数据记录。当用户加载他的流时,您会轮询他的每个朋友的数据记录,动态聚合结果
当加载流的频率比用户更新的频率高得多,并且用户的“扇出”(例如,用户拥有的最大跟随者数量)较低时,推送方法很好。当加载流的用户很少,或者用户可以跟随的用户数很少时,pull方法是很好的

我与人合著了一本关于如何有效地做到这一点的书。基本上,我们使用了一种混合方法,根据用户统计数据确定何时推送或拉送


为了简单起见,我建议您实现pull模型。缓存聚合结果,并仅在缓存条目过期一段时间后刷新用户的提要。

我们已经针对用户首次进入页面的情况开发了pull。我们需要高效的推送实时更新(这样用户就不需要刷新页面)。您是否只推送当前登录并处于活动状态的用户?如果你只推给那些用户,你还存在可伸缩性问题吗?事实上,这不是一个选项,因为写给我所有的朋友会花费很长时间,如果我必须验证我的100万朋友是否已登录并处于活动状态,这将花费很长时间。为什么不保留一个活动用户ID列表?然后,如果你在内存中加载了100万个好友用户ID,只需与活动集相交,然后只更新这些ID?