使用Google App Engine的大量多用户实时应用程序

时间:2011-12-03 07:53:39

标签: google-app-engine real-time multi-user channel-api

我正在构建一个使用Google App Engine (Python)的多用户实时应用程序,看起来像Facebook直播插件:https://developers.facebook.com/docs/reference/plugins/live-stream/

这意味着:同一网页上的1到1 000 000名用户可以执行立即通知其他人的操作。这就像群聊,但有很多人......

我的问题:
- App Engine 能够扩展到这种数字吗? - 如果是的话,你会如何设计呢? - 如果不是,你的建议是什么?

现在,这是我的设计:
- 我正在使用App Engine Channel API - 我存储在memcache中连接的每个用户
- 每次执行操作时,都会将通知任务添加到任务队列中 - 任务包括从memcache中检索所有用户并向他们发送通知。

我知道我的瓶颈在于任务。通过相同的任务/请求通知每个人。目前,对于连接的30个用户,它持续约1秒,因此对于10万用户,您可以想象可以花多长时间。

你怎么纠正这个?

非常感谢

1 个答案:

答案 0 :(得分:11)

您希望每位用户每次更新多少次?如果每个用户每小时只更新一次,那么您每小时将发送10 ^ 12条消息 - 每条发送的消息都会导致1,000,000多条消息。这是每秒277 百万个消息。换句话说,如果每个用户每小时发送一条消息,则每秒发送277条消息,或者发送2.77亿条外发消息。

所以我觉得你的基本设计存在缺陷。但基本问题是:“我如何向大量用户广播相同的消息”仍然有效,我将解决它。

正如您所发现的那样,Channel API在广播时效果不佳,因为每次调用大约需要50ms。您可以通过并行执行多个任务来解决此问题。

对于这样的情况 - 许多客户需要完全相同的无状态数据,我鼓励您使用轮询,而不是Channel API,因为每个客户端都会收到确切的相同的信息 - 无需向每个客户发送个性化消息。确定可接受的平均等待时间(例如,1秒)并以该速率的两倍(例如2秒)进行轮询。编写一个非常轻量级的memcache支持的servlet来获取最新的数据块并让客户端重复数据删除。