【问题标题】:Does CometD (Comet with Bayeux Protocol) use HTTP streaming or HTTP long polling?CometD(带有 Bayeux 协议的彗星)是否使用 HTTP 流式传输或 HTTP 长轮询?
【发布时间】:2015-07-10 03:33:45
【问题描述】:

有两种实现 Comet 的技术。一种使用 HTTP 流,它使用单个持久 TCP 连接在客户端/服务器之间发送和接收多个 HTTP 请求/响应。第二种是 HTTP 长轮询,它使服务器保持连接打开,并且一旦发生事件,响应被提交并且连接被关闭。然后,客户端立即重新打开一个新的长轮询连接,等待新的事件到达。

我正在使用 Faye ruby​​ gem,我注意到它使用了开箱即用的 Comet/Bayeux。但我不知道它使用了哪种彗星技术。我只是收集到 Bayeux 是发布订阅协议。我很想知道它是否存在与 HTTP 流和长轮询相同的缺点。它是否允许全双工通信(双向通信,并且与半双工不同,它允许同时发生。)?

【问题讨论】:

    标签: ajax comet long-polling http-streaming bayeux


    【解决方案1】:

    您对 HTTP 流和长轮询的定义不正确。

    在 HTTP 流中,客户端向服务器发送请求,服务器以包含小块数据(消息)的“无限”响应进行回复,通常使用分块传输编码。 此机制已标准化为EventSource(也称为服务器发送事件)。 它是仅服务器到客户端的事件推送。 为了让客户端向服务器发送另一条消息,它必须打开一个新连接。

    在 HTTP 长轮询中,客户端发送由服务器持有的请求,直到发生事件(或超时),然后提交响应但连接关闭。 连接保持打开状态,并且可以在该连接上发送其他请求,包括正常或长轮询请求(当然,一次一个)。

    Bayeux protocol 是在 HTTP 或 WebSocket 等传输协议之上的应用协议。

    HTTP 是在单个请求/响应交换的上下文中的全双工协议。多个 HTTP 交换被序列化(即一个接一个地执行)。 HTTP 请求/响应 exchange 是序列化的单位。

    WebSocket 是 WebSocket 消息上下文中的全双工协议。 WebSocket 消息可以同时发送和接收。 WebSocket 消息是序列化的单位。

    Bayeux 继承了传输协议的特点。 Bayeux 协议本身并没有任何“双工”特性,您可以将其视为一种将消息格式化为特定文本形式的方式。

    CometDFaye 在 WebSocket 和 HTTP 长轮询上都使用 Bayeux。

    【讨论】:

    • Comet 怎么不会导致像 apache2 这样的 http 服务器在打开这么多的 tcp 连接时崩溃,消耗内存。我的意思是,如果你有 64,000 个打开的 tcp 连接,每个 1mb,那仅是 64gb 的内存,肯定会导致大多数服务器崩溃。
    • 单独的 tcp 连接不会消耗 1 MiB 的内存。与该连接关联的线程会消耗该 MiB。这就是为什么 apache2 不是用于长轮询的正确服务器的原因。其他服务器,如Jetty(为CometD 提供支持)、nginx 等能够在不消耗大量内存的情况下维持数万个连接,因为它们在这种情况下以更有效的方式使用异步 I/O 和线程。在达到内存限制之前,我能够将 400,000 个 CometD 客户端连接到单个 CometD/Jetty 服务器。
    • 感谢您的精彩反馈。我用的是apache2,但是看了你的cmets后,是nginx。
    猜你喜欢
    • 2012-12-25
    • 2012-03-23
    • 2023-01-14
    • 2014-07-23
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多