如何在 Google AppEngine 上实现“实时”消息传递?

Posted

技术标签:

【中文标题】如何在 Google AppEngine 上实现“实时”消息传递?【英文标题】:How can I implement "real time" messaging on Google AppEngine? 【发布时间】:2010-04-17 22:31:39 【问题描述】:

我正在 Google AppEngine 上创建一个网络应用程序,我希望在发生某些事件后尽快通知用户。这个问题类似于说一个聊天服务器,因为我需要在一个连接上发生一些事情(某人正在聊天室中写一条消息)以传播到许多其他连接(该聊天室中的其他人收到消息)。为了从服务器快速更新到客户端,我计划对 XmlHttpRequest 使用长轮询,希望 AppEngine 除了可能重新设置超时之外不会干扰。然而,真正的问题是 AppEngine 上的连接之间的有效通知。

AppEngine 上是否支持这种类型的不涉及忙等待的交叉连接通知?我能想到的唯一工具是使用数据存储(慢)或 memcache(不可靠),它们都不会让我避免忙于等待。

注意:我知道 AppEngine 上的 XMPP 支持。这是相关的,但我想要一个基于浏览器的解决方案,通过 XMPP 向用户发送消息不是一种选择。

【问题讨论】:

您的意思是“实时”还是“预期延迟小”?前者无法通过 Internet 实现,因为您无法将 any 限制在传递消息的时间量上。如果不出意外,那就是反铲效应...... 我将实时时间放在引号中以暗示我不希望对从一个连接到另一个连接获得通知所需的时间进行严格的实时限制。我真的在寻求一种延迟尽可能小的解决方案,同时仍保持在合理的资源需求范围内。 【参考方案1】:

App Engine 上的请求被限制为 30 秒的执行时间,这使得长轮询变得困难。此外,您需要保持较低的平均执行时间,否则您将很快用完实例来执行您的查询 - App Engine 只会在您的应用程序相当快的情况下配置新实例。出于这些原因,在 App Engine 上极力劝阻长轮询。

但是,如果您准备等待一段时间,roadmap 包含“支持浏览器推送(彗星)通信”,这正是您正在寻找的。​​p>

【讨论】:

谢谢,这解释了在实践中难以进行长轮询的限制。 HTTP 连接和数据存储 API 请求都有配额,因此会产生相关成本,如果您在实践中使用长轮询,您最终会很快耗尽这两者。跨度> 【参考方案2】:

App Engine 路线图支持 Comet,否则您将难以实现。

【讨论】:

您能否详细说明一下今天无法在 AppEngine 上进行长轮询,以及 AppEngine 的“彗星支持”是什么意思?【参考方案3】:

您始终可以使用托管彗星服务,例如WebSync On-Demand。无论您使用哪种类型的服务器进行托管,您都可以将事件推送出去。

【讨论】:

以上是关于如何在 Google AppEngine 上实现“实时”消息传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VuePress 上实现 Google Adsense?

在 Appengine 数据存储中设置操作

Google PubSub:使用 AppEngine 推送端点订阅时出现 SSL 错误

如何在 Groovy/Grails 上实现社交网络登录? [关闭]

在 App Engine 上使用 OAuth2 的 IMAP

我正在尝试通过 Google Places 在 Google Maps 上实现搜索。但是谷歌搜索出现了