【问题标题】:Massive multi-user realtime application with Google App Engine使用 Google App Engine 的大型多用户实时应用程序
【发布时间】:2012-01-12 01:49:11
【问题描述】:

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

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

我的问题:
- App Engine 能够扩展到到那种数字吗?
- 如果是,你会如何设计它?
- 如果没有,您有什么建议?

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

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

你会如何纠正这个问题?

非常感谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢莫伊舍!其实我在考虑投票,你给我确认。所以我想我会马上实施。再次感谢您的响应(即使在周末):App Engine 团队非常棒!
    • 我认为您的意思是“以该比率的一半进行轮询” - 或间隔的两倍。此外,值得注意的是,您可以依赖前端缓存来实现此解决方案,因此大多数轮询请求根本不会到达后端。
    • 实际上,在过去的几天里,我对很多选项进行了基准测试:托管和非托管解决方案,从 PubNub、Pusher、Beaconpush 到 node.js/socket.io 等。我想我会去 PubNub。他们似乎有一个用于 App Engine 的 SDK。不过有一个问题:App Engine 团队是否有计划在未来几个月内推出“扇出”/“广播”推送 API。谢谢
    猜你喜欢
    • 2016-07-21
    • 2017-03-08
    • 2017-01-27
    • 2014-01-13
    • 2019-01-17
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多