【转】Comet与Bayeux

kongshanxuelin 2008-09-26
任何一个想实现专业Comet产品都避免不了去了解Bayeux, 它定义了一个协议,通过一系列 json 的事件来实现 pubsub 模型进而实现Comet各种业务。它也致力让自己成为Comet的标准。小型的Comet应用通常会在Streaming里面返回一些自定义的 JavaScript来实现各种业务功能,但是Bayeux实现了一个full stack的体系,包括客户端服务器的交互,Event, Transport协商, Authentication, Security等。

Bayeux一些术语和概念包括

    * Pub/Sub,Bayeux的核心就是通过一个pub/sub模型来实现Comet各种业务。
    * ClientID, 通过客户端handshake之后服务器分配。
    * Channel,订阅的频道,可以理解成聊天的房间。
    * Messages: 所有的包都封装成一个message,里面包含各种字段。
    * data: message中的数据元素,应用可以根据业务再次定义细分的格式。


Bayeux的优势很明显,通过与Jetty配合可以几十行程序实现一个comet的聊天室demo

缺点

    * PubSub模型,点对点支持不佳,除了多人聊天的场合之外,其实大部分comet应用更适合点对点的模式。如果用PubSub套上去也可以实现,问题是对服务器的压力更高,而且通常comet应用的访问量都比较大。
    * 可靠性,一条信息publish了没法知道客户是否能收到了,也没法做进一步处理比如说保存或重发等业务逻辑。
    * 顺序,publisher顺序和接收显示的顺序
    * 多Tab浏览器打开同一个Comet应用,或者在IE里面Ctrl-N再次打开当前页面新窗口。


更详细的比较可参看 Battle of the Bayeux 系列

尽管Bayeux喜忧参半,但是对于希望实现一个专业Comet应用的开发者来说,Bayeux的诱惑是巨大的,它有开发者需要的完备的接口和成熟的体系架构。如果绕开它,不管是服务器还是客户端都需要一个漫长的摸索和自己定义规范的过程。如果看了这篇自己用C实现的comet http server,基于libevent以为就搞定Comet那可能就低估难度了。

Bayeux的例子可以通过下载Jetty6看到。
Global site tag (gtag.js) - Google Analytics