2

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

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

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

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

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

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

  2. 另一种选择是定义一些命名队列,以便每个客户端在连接到服务器时创建这样的队列并等待新消息。当某个客户端向“134 号聊天室”发布一条新消息时,在服务器端将其广播到连接到该“134 号聊天室”的所有队列,并将该消息传递给客户端。

    然而,有许多问题被提出:

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

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

那么,我想知道,服务器端推送技术背后最流行和推荐的 API 模型是什么?

谢谢

编辑:添加了第三个选项

4

3 回答 3

3

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

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

于 2009-08-10T14:45:29.470 回答
3

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

如果您最终使用 XMPP 和 BOSH,这里有一些工具可能对您有用:

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

诚然,这是一个非常重量级的解决方案,它可能不适合您的特定应用程序,但对这些标准进行了很多思考,因此它们可能会有所帮助。

于 2009-08-11T23:39:51.377 回答
0

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

我曾经参加过的一次演示中有一些在线幻灯片(这是该主题的一个相当高级的视图)。

于 2009-08-10T15:44:46.770 回答