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

标签 api model comet server-push

我正在向 CppCMS 添加对服务器端事件的支持。我了解如何操作的技术部分 通信级别:客户端发送长轮询XmlHTTPRequest,并等待响应, 服务器接受连接并且不响应,直到服务器端事件发生并发送 对客户端的响应。客户端重复该过程。

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

我考虑了两种可能的模型:

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

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

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

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

    但是,出现了许多问题:

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

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

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

谢谢

编辑:添加了第三个选项

最佳答案

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

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

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

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

关于服务器推送技术的 API 模型 (COMET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1218292/

相关文章:

Django model_to_dict 在转换模型时跳过所有 DateTimeField

javascript - Vimeo channel 和视频未显示

javascript - 使用 JS 通过 LinkedIn Groups API 创建新帖子?

Django设计问题: extending User to make users that can't log in

模型类和POJO类

iframe - 需要对 Comet 和长轮询概念进行解释(特别是隐藏的 iframe 技术)

node.js - 使用 WebSocket 是否有服务器成本?

Express 中间件中的 Node.js JWT 刷新 token

amazon-web-services - Ubuntu Aws 用户 session 停止

ajax - Firefox 网站如何使其下载统计页面正常工作?