使用Google App Engine实现大规模多用户实时应用程序

9
我正在使用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秒钟的时间,因此对于100,000个用户,你可以想象需要多长时间。
你会如何纠正这个问题?
非常感谢!
1个回答

11
你希望每个用户每秒更新多少次?如果每个用户每小时只更新一次,你每小时将发送10^12条消息 -- 每发送一条消息会导致1,000,000条更多的发送。这是每秒277百万条消息。换句话说,如果每个用户每小时发送一条消息,则每秒会有277条传入消息或277百万条传出消息。
所以我认为你的基本设计是有缺陷的。但根本问题:“如何向许多用户广播相同的消息”仍然有效,我会解决它。
正如你发现的那样,Channel API 广播不好,因为每个调用需要大约50ms。你可以通过并行执行多个任务来解决这个问题。
对于像这样的情况 -- 需要完全相同状态信息的大量客户端,我建议使用轮询而不是 Channel API,因为每个客户端将接收完全相同的信息 -- 不需要向每个客户端发送个性化的消息。确定可接受的平均延迟(例如 1 秒)并以两倍的速度(例如 2 秒)进行轮询。编写一个非常轻量级的、基于内存缓存的 servlet 只需获取最新的数据块,并让客户端去重复。

非常感谢你,Moishe!实际上我正在考虑轮询,而你给了我确认。所以我想立即实施它。再次感谢你的响应能力(即使在周末):App Engine团队真是太棒了! - Damien
1
我认为你的意思是“以一半的速率轮询” - 或者两倍的间隔。另外,值得注意的是,你可以依靠前端缓存来解决这个问题,因此大多数轮询请求根本不会触及后端。 - Nick Johnson
3
实际上,我在过去的几天里对许多选项进行了基准测试:从 PubNub、Pusher、Beaconpush 到 node.js/socket.io 等托管和非托管解决方案。我想我会选择 PubNub。他们似乎有一个适用于 App Engine 的 SDK。不过还有一个问题:App Engine 团队是否有计划在未来几个月推出“扇出”/“广播”推送 API?谢谢。 - Damien

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