【问题标题】:Realtime Socket.IO scaling problem - python实时 Socket.IO 缩放问题 - python
【发布时间】:2011-09-27 14:44:12
【问题描述】:

我正在尝试在 Facebook 上使用 socket.io 0.6 和 torndio 做类似流的事情。

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

问题在于扩展:如果我有 100 万朋友怎么办?把所有的墙都写下来需要很长时间。

是否有任何使用彗星更有效的解决方案?

【问题讨论】:

    标签: python real-time socket.io tornado


    【解决方案1】:

    这是社交领域的一个难题。两种方法之间需要权衡取舍:

    • 推送:当用户产生事件(例如状态更新)时,您将该状态更新推送到用户的每个朋友的信息流中。当用户加载他或她的流时,您只需从一个地方读取一条记录。
    • pull:当用户产生事件时,您甚至会将其写入用户的数据记录。当用户加载他的信息流时,您会轮询他每个朋友的数据记录,动态汇总结果。

    当加载流比用户更新更频繁并且用户的“扇出”(例如用户拥有的最大关注者数量)较低时,推送方法很好。当用户加载他的流的用户很少,或者用户可以关注的用户数量很少时,拉方法是很好的。

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

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

    【讨论】:

    • 我们已经为用户第一次进入页面的情况开发了 pull。我们需要有效推送实时更新(这样用户不需要刷新页面)。
    • 您是否只推送给当前已登录并处于活动状态的用户?如果你只推送给这些用户,你是否还有可扩展性问题?
    • 事实上这不是一个选项,因为写信给我所有的朋友会花费很长时间,如果我必须验证我的 100 万个朋友是否已登录并处于活动状态,那将需要很长时间.
    • 为什么不保留活动用户 ID 列表?那么如果你在内存中加载 100 万个好友用户 ID,只需取与活动集的交集并只更新那些?
    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2012-01-05
    • 2020-09-27
    • 2019-05-24
    • 2013-02-12
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多