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

Dam*_*ien 9 google-app-engine real-time multi-user channel-api

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

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

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

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

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

你怎么纠正这个?

非常感谢

Moi*_*vin 11

每个用户每秒有多少次更新?如果每个用户每小时更新一次,您将每小时发送10 ^ 12条消息 - 每封发送的消息会导致1,000,000多封发送.这是每秒2.77 亿条消息.换句话说,如果每个用户每小时发送一条消息,则每秒发送277条消息,或277万条外发消息.

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

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

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

  • 实际上我在过去几天里对很多选项进行了基准测试:托管和非托管解决方案,范围从PubNub,Pusher,Beaconpush到node.js/socket.io,等等.我想我会选择PubNub.他们似乎有一个App Engine的SDK.但有一个问题是:App Engine团队是否有计划在未来几个月内推出"扇出"/"广播"推送API.谢谢 (3认同)