Google App Engine Channel API尝鲜

标签:Google App Engine

今天在GAE论坛发现有人在讨论Channel API,由于自己也很感兴趣,于是也去研究了一下。

其实这个Channel API就是Server Push技术(别名很多,还有长连接、Comet等名称),说到这里应该有很多人清楚是什么了。
简单来说,一般的HTTP连接是由用户代理发起,服务器接收到请求后,处理并返回响应,同时关闭连接。在这种模式下,当用户需要时时获取信息时,不得不每隔一段时间,利用AJAX技术来轮询服务器,造成了大量的浪费。
正是因为由用户来pull数据会造成浪费,人们就想出了由服务器来push数据的方法。当用户代理与服务器建立连接后,双方并不关闭连接;当服务器有更新时,由服务器来发送数据给用户代理,由用户代理来被动地接收数据。实际上就是从轮询变成了中断,效率自然提高了很多。
当然这种方法也不是没有缺陷,首先是服务器要消耗更多资源来保持连接,其次是一个用户代理与指定服务器之间最多只能有2个长连接(以前是这样,不知道目前和将来是否会改变),此外实现起来也很复杂。

毫无疑问,这种Server Push技术对于网游、聊天室等来说是非常合适的,可惜GAE一直不支持——连接最多保持30秒,必须一次发出所有响应。
不过今年,GAE团队终于将支持它摆上了roadmap,并在Google I/O 2010里做了《Building real-time web apps with App Engine and the Feed API》这次session。

由于没有文档,只能自己读源码了。
这里是Channel API的源码,基本上没什么价值,只是列出了2个函数而已:create_channel(application_key)和send_message(application_key, message)。

好在我又找到个trivia-quiz,这是一个多人在线答题的应用。
简要说下思路吧:首先是用户登录,并在数据库里记录用户数据,并按10个一组来对用户分组。接着随机给用户出题,用户用AJAX技术来答题。然后重点就来了,服务器端找到用户所在组,并对所有该组的用户广播消息(注意其他用户并没有主动去发出请求),这就是Server Push了。
不过针对一个请求,可能仍有30秒的时间限制,只不过channel是持续存在的,直到连接关闭。

还有一点必须要说的就是,还需要引入一个JavaScript:/_ah/channel/jsapi。
这个文件里定义了goog.appengine.Channel类,需要自己去创建一个Channel对象,调用open方法来连接。而它的onopen方法和onmessage方法就不用再说明了吧。

目前Channel API已经开始对外测试了,有兴趣的可以去Channel API Trusted Tester Sign-up申请一下尝鲜。
估计再过几个版本就会正式发布了吧,到时候也有文档可以读了=。=

0条评论 你不来一发么↓

    想说点什么呢?