Comet 是一种架构风格,而 Websockets/HTTP Streaming/SSE/BOSH/Bayeux 是这种架构风格的不同实现吗?
术语“彗星”诞生于上一任“Ajax”的笑话。
AJAX(作为异步 JavaScript 和 XML)是一种执行 HTTP 请求和处理来自浏览器 JavaScript 引擎的 HTTP 响应的技术。当时,“Ajax”也是一种清洁产品。
当使用 AJAX 的开发人员开始探索向浏览器执行低延迟传输服务器端事件的技术时,创造了术语“Comet” ,因为当时“Comet”是另一种据称比“Ajax”清洁更好的清洁产品产品,“彗星”技术优于“Ajax”技术。
“Comet”是一系列用于 Web 的 HTTP 技术,用于以非常小的延迟(远小于一秒)通知客户端(通常是浏览器)服务器端事件。
“长轮询”就是这样一种技术,可能是最流行和最可靠的。其他此类技术包括“隐藏 iframe”、“脚本注入”(又名 JSONP)和“无限响应”(又名“流”)技术(例如使用 HTTP/1.1 的Transfer-Encoding: chunked机制)。
现在,服务器发送事件(SSE,又名EventSource)是一种已经标准化的流技术,尽管最近没有看到太多发展。Transfer-Encoding: chunkedSSE没有使用该机制,而是使用Content-Type: text/event-stream浏览器实现的,以及一个基于 HTTP 传输机制的简单协议。这意味着来自服务器的内容具有一种格式——由这个简单的协议定义——需要由浏览器解析以转换为传递给 JavaScript 引擎的事件,并且应用程序有一个 API 能够监听到这些 JavaScript 事件。
BOSH(由XEP-0124定义)是长轮询技术的一种变体,特别是在 XMPP 中使用,因此它也是一种“彗星”技术。
Bayeux是一种传输不可知协议,它在传输协议(如 HTTP 或 WebSocket)之上定义通道和消息语义。该的cometd项目采用HTTP和WebSocket的顶部贝叶提供对等网络,发布-订阅和远程通话功能到应用程序。其他项目在 HTTP 或 WebSocket(或两者)之上使用 Bayeux 协议。
最后,WebSocket 是一种具有内置双向功能的传输协议,这是 HTTP 所没有的。但是,它没有定义它传输的有效负载的语义,也没有描述它的元数据,因此它通常用作其他协议(例如 Bayeux)的传输协议。WebSocket 不是“彗星”技术,因为它不是基于 HTTP。
这实际上取决于您对“架构”一词的含义。
我会说“Comet”是一组使用 HTTP 实现低延迟事件的技术。
长轮询、HTTP 分块流、SSE、BOSH 是其中一些“彗星”技术。
Bayeux 是一种基于 JSON 的传输不可知协议,用于消息传递。
WebSocket 是一种双向传输协议,可与其他通常与传输无关的协议(如 Bayeux)结合使用。它在浏览器中的支持使其成为“彗星”技术的替代品。