首页 文章

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

提问于
浏览
2

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

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

我想过两种可能的模型:

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

当其他一些客户端将数据发布到服务器时,它会通知所有应用程序“Chat Room no 134中的新消息”事件,并且它们会唤醒并将这些消息发送给客户端,依此类推 .

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

  • 另一个选项是定义一些命名队列,因此每个客户端在连接到服务器时创建这样的队列并等待新消息 . 当某个客户端向“Chat Room no 134”发布新消息时,在服务器端将其广播到连接到该“Chat Room no 134”的所有队列,并将消息传递给客户端 .

然而,有许多问题上升:

  • 如何在单页级别管理队列和会话级别?

  • 如何删除队列并在其上创建超时?

  • 如果多于一个"window"订阅同一个队列会怎样?

  • 在服务器端创建一个粘合在服务器端事件和用户端事件之间的持久对象 . 它可以通过重定向到它的不同XHR请求进行通信 .

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

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

谢谢

Edit :添加了第三个选项

3 回答

  • 3

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

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

    • StropheJS:用于编写说BOSH的客户端XMPP客户端的库 .

    • Idavoll:XMPP服务器的通用发布 - 订阅服务组件 .

    • Punjab:BOSH连接管理器,充当BOSH HTTP客户端和XMPP服务器之间的某种"translating proxy" .

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

  • 3

    试试Bayeux,它非常像你的第一个模特 . 客户订阅 Channels "chatroom/new-message/134" . 如果有新消息,服务器将广播给订户 .

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

  • 0

    没有适合所有应用的通用解决方案 . 如果您想了解一些一般模式,请查看 Event-Driven Architectures .

    我参加过的一次演讲中有一些在线(这是一个相当高级别的主题视图) .

相关问题