2011-09-27 46 views
2

我正在尝试做一些像Facebook,与socket.io 0.6和tornadio流。实时Socket.IO缩放问题 - python

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

问题是关于缩放:如果我有100万个朋友呢?在所有的墙壁上写字需要很长的时间。

有没有解决方案更有效地使用彗星做到这一点?

回答

2

这是社会空间中的一个难题。有两种方法之间的权衡:

  • :当用户产生的事件(如状态更新),你把那个状态更新到每个用户的朋友的流。当用户加载他或她的流时,您只需从一个地方读取记录。
  • pull:当用户产生一个事件时,你甚至可以写入用户的数据记录。当用户加载他的流时,您会轮询他的每个朋友的数据记录,并即时汇总结果。

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

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

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

+0

我们已经开发了用于第一次进入该页面时的情况。我们需要对实时更新进行有效推送(这样用户不需要刷新页面)。 –

+0

你只推送给当前登录并激活的用户吗?如果您只推送给这些用户,您是否仍然存在可扩展性问题? – jterrace

+0

事实上,这不是一种选择,因为写给我所有的朋友需要很长时间,如果我必须验证我的100万朋友是否已登录并激活,则需要很长时间。 –