【问题标题】:API Model for Server Push Technologies (COMET)服务器推送技术的 API 模型 (COMET)
【发布时间】:2010-11-16 03:21:37
【问题描述】:

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

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

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

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

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

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

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

    但是有很多问题被提出:

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

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

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

谢谢

编辑:添加第三个选项

【问题讨论】:

    标签: api model comet server-push


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • Bayeux 是彗星式通信最简洁、最简单的标准之一。
      • +1 贝叶。简单、有效,没有 XMPP 的额外复杂性。
      【解决方案3】:

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

      有一些slides 来自我曾经参加过的一次演讲(这是一个相当高级的主题视图)。

      【讨论】:

        猜你喜欢
        • 2011-08-17
        • 1970-01-01
        • 2011-12-23
        • 2017-11-28
        • 2023-03-22
        • 2011-05-16
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        相关资源
        最近更新 更多