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 向他们发送通知。

我知道我的瓶颈在于任务。每个人都通过相同的任务/请求得到通知。现在,对于 30 个连接的用户,它持续大约 1 秒,所以对于 100 000 个用户,你可以想象它需要多长时间。

你会如何纠正这个?

非常感谢

4

1 回答 1

11

您希望每个用户每秒有多少更新?如果每个用户每小时只更新一次,您将每小时发送 10^12 条消息——每发送一条消息会导致多发送 1,000,000 条消息。这是每秒2.77亿条消息。换句话说,如果每个用户每小时发送一条消息,则每秒可以收到 277 条传入消息,或 2.77 亿条传出消息。

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

正如您所发现的,Channel API 并不擅长广播,因为每次调用大约需要 50 毫秒。您可以通过并行执行多个任务来解决此问题。

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

于 2011-12-03T17:58:59.787 回答