服务器推送技术的API模型(COMET)

时间:2009-08-02 06:32:12

标签: api model comet server-push

我很想将服务器端事件的支持添加到CppCMS。我理解该怎么做的技术部分 通信级别:客户端发送长轮询XmlHTTPRequest,并等待响应, 服务器接受连接,并且在服务器端事件发生并发送之前不响应 对客户的回应。客户重复该程序。

但是,对于大多数Web开发人员来说,这个级别太低了。有很多问题:我如何管理事件,如何管理连接等。

我想到了两种可能的模型:

  1. 定义了一些命名事件和服务器端, 例如“134号聊天室的新消息”; 当请求接受服务器端应用程序检查消息时 在房间里(例如在DB中)并且如果客户端没有新消息 它订阅了事件并等待它。

    当其他客户端将数据发布到服务器时,它会通知所有应用程序 “聊天室内没有134的新消息”事件,他们醒来并发送这些消息 对客户等等。

    这个模型看起来仍然很“低级”模型,但它隐藏了所有模型 通知方法。

  2. 另一种选择是定义一些命名队列,因此每个客户端都会创建这样的队列 连接到服务器时排队并等待新消息。当一些客户 将新消息发布到“聊天室号134”,在服务器端进行广播 连接到此“Chat Room no 134”的所有队列,并传递消息 对客户。

    然而,有许多问题已经出现:

    • 如何在单页级别管理队列和会话级别?
    • 如何删除队列并为其创建超时?
    • 如果超过一个“窗口”订阅同一个队列会怎样?
  3. 在服务器端创建一个粘合服务器端事件的持久对象 和用户方事件。它可以通过不同的XHR请求进行通信 重定向到它。

    因此客户端(JavaScript)使用XHR注册事件并等待它们 和服务器端调度事件通知,直到页面重建。

  4. 所以,我想知道,最受欢迎和推荐的是什么 服务器端推送技术背后的API模型?

    由于

    修改:添加了第三个选项

3 个答案:

答案 0 :(得分:3)

试试Bayeux,这非常像你的第一个模特。客户端订阅频道“chatroom / new-message / 134”。如果有新的消息,服务器将广播给订阅者

您可以使用通配符通道名称订阅多个房间“chatroom / new-message / *”(仅限跟踪)

答案 1 :(得分:3)

您应该查看XMPP PubSub,它定义了XMPP上的通用发布/订阅协议。还有一个XMPP extension called BOSH(较低级别的协议详细信息在XEP-0124中单独记录),它定义了一种允许HTTP客户端使用长轮询(即comet)绑定到XMPP服务器的机制。结合这两个规范,您可以使用彗星为Web应用程序提供强大的事件订阅模型。即使你最终没有使用XMPP / BOSH,这些规范也包含了对如何构建这种系统的一些有价值的见解。

如果你最终使用XMPP和BOSH,这里有一些你可能会觉得有用的工具:

  • StropheJS:用于编写说BOSH的客户端XMPP客户端的库。
  • Idavoll:XMPP服务器的通用发布 - 订阅服务组件。
  • Punjab:一个BOSH连接管理器,充当BOSH HTTP客户端和XMPP服务器之间的“转换代理”。

不可否认,这是一个非常重量级的解决方案,它可能不适合您的特定应用,但很多想法都被纳入这些标准,因此它们可能会有所帮助。

答案 2 :(得分:0)

没有适用于所有应用程序的通用解决方案。如果您想了解一些常规模式,请查看事件驱动的体系结构

我参加的演示文稿中有一些slides在线(这是该主题的高级视图)。