Comet 现在是不是已经过时了 Server-Sent Events 和 WebSocket? [关闭]
Posted
技术标签:
【中文标题】Comet 现在是不是已经过时了 Server-Sent Events 和 WebSocket? [关闭]【英文标题】:Is Comet obsolete now with Server-Sent Events and WebSocket? [closed]Comet 现在是否已经过时了 Server-Sent Events 和 WebSocket? [关闭] 【发布时间】:2012-08-18 04:43:33 【问题描述】:还是说服务器发送事件和 WebSocket 会取代 Comet 技术?
【问题讨论】:
这和 asp.net-mvc 有什么关系? 什么都没有。我删除了标签。 我不同意这个问题过于宽泛。 “彗星技术”的范围有限,询问这些较新的 API 是否涵盖相同的用例是相关的。 【参考方案1】:我将从术语和历史的角度来回答这个问题。
正如我在this other answer 中所写,我们可以使用几个概括性术语之一来指代可用于将事件从 Web 服务器异步发送到 Web 客户端(反之亦然)的一组技术。 “Push Technology”这个词已经使用了十五年(关于 Push Technology 的简短历史,你可以看到这个old white paper我多年前写的——完全披露:我是 Lightstreamer 的创造者) .现在,“Web Streaming”这一术语正在 IT 分析师中获得共识(参见 Gartner,“Cool Vendors in Application and Integration Platforms,2012”,作者 Massimo Pezzini 和 Jess Thompson,2012 年 4 月 11 日)。
重要的方面是我们正在谈论基于 Web 的通信,即利用 Web 协议。有大量不基于 Web 的消息传递协议和技术(例如,大多数 MOM),我们不将它们视为推送技术(或 Web 流)的一部分。
话虽如此,您可以区分推送技术(或 Web 流媒体)的两个子类别:
HTTP 基于 WebSockets 基于HTTP 和 WebSockets 都是 Web 协议。
如果你分解基于HTTP的推送机制,你可以识别:
HTTP 流媒体 HTTP 长轮询 HTTP 轮询传统上,“Comet”一词(由 Alex Russell 于 2006 创造)一直指 HTTP 流式传输和 HTTP 轮询。但请考虑 HTTP 流的第一个实现可以追溯到 2000,远在 Comet 术语被创造之前(例如 Pushlets 和 Lightstreamer)。
现在,WebSockets 使 Web 流式传输的实现更加简单,尤其是对于“反向”通道(从浏览器发送到服务器的消息)。有关 HTTP 反向通道特性的更详细说明,请参阅我为 CometDaily 撰写的这篇文章的最后部分:http://cometdaily.com/2011/07/06/push-technology-comet-and-websockets-10-years-of-history-from-lightstreamers-perspective/
正如 Phil 所指出的,Comet 仍然是必要的,而且可能还会持续几年,因为不仅有旧的浏览器(包括不支持 WebSockets 的 IE9……)而且还有无数的网络中介可以做到不会说WS。例如,我们已经看到一些国家的一些移动运营商(例如意大利沃达丰)支持 WSS 但屏蔽了 WS。所以一个没有彗星“黑客”的世界还很遥远……让我补充一点,就个人而言,我从来不喜欢应用于彗星的“黑客”一词(或者,从更正确的历史角度来看,适用于 HTTP 流和 HTTP 长轮询)。在这些技术上工作了 12 年,我可以说我们已经能够对它们进行如此多的改进,以至于它们本身已经成为一项成熟的技术,完全可靠并且每天用于许多关键的生产场景(金融、航空航天、和军事,仅举几例)。
现在,让我们想象一个 WebSockets 得到普遍支持并且不再需要 Comet 的世界。你到底得到了什么?好吧,只是一个双向传输,仅此而已……在它之上,您需要构建所有内容:消息传递协议(可能基于 pub/sub),与服务器代码对话的服务器端接口,以及一套很好的优化技术和算法来管理数据流,包括带宽管理、数据合并、自动节流、增量交付等。 好消息是消息传递协议和优化机制都已经由好的 Comet 解决方案实现了。因此,扩展以前的 Comet 服务器以支持 WebSocket 是我们所有供应商都实施的自然演变。
因此,简而言之,在不远的将来,WebSockets 可能会使 Comet 传输过时,但需要吸收所有已经在传统 Comet 服务器上实现并经过良好测试的更高层。
【讨论】:
好点,感谢分享! 您说过,在 websockets 世界中,没有 Comet,您只会获得全双工通信,而无需消息协议 (pub/sub)。但这不一定是真的。雷迪斯呢? Redis 支持发布/订阅。 @Donato:没错,在这种情况下,添加消息传递协议的是 Redis,而不是 websocket 本身。这证实了我所说的:WS 只是一个双向传输。如果您需要发布/订阅,则需要在其顶部添加一些其他“协议”(例如 Redis)。【参考方案2】:Comet 是一组技术原理/通信模式,通常使用 HTTP 长轮询来实现。它使服务器能够按需向浏览器发送数据(即服务器推送)。当前的 Comet 实现需要在客户端使用一些复杂的 javascript,并在服务器端提供支持(对于长期持有的请求)。
服务器发送事件 是一个标准 (html5) 浏览器 API,用于启用这种按需服务器推送。您可以将服务器发送事件视为使用复杂的 Javascript 完成的操作并将其推送到浏览器本身。
WebSockets 允许浏览器与支持 WebSocket 的服务器建立持久的全双工/双向连接。它不需要客户端定期向服务器发出 HTTP 请求以维持连接,就像使用 AJAX/long-poll 一样。建立连接后,与普通 HTTP/HTTP 长轮询的开销相比,每条消息的开销非常低(几个字节)。您可以使用 WebSockets 进行高效的服务器推送,但这只是一个应用程序。
还有一些库建立在 AJAX/comet/WebSockets 传输层之上,提供会话管理、频道、广播、发布订阅等功能。CometD 就是一个例子。另一个流行的例子是 Socket.IO。如果 WebSockets 可用于底层传输,两者都支持 WebSockets,但如果 WebSockets 不可用,它们也支持标准 AJAX/long-poll。
【讨论】:
【参考方案3】:我最初以为WebSockets realise Comet. They’re not an alternative。然而,经过一番讨论,我后来得到了“彗星”的创造者Alex Russell 的纠正和说服,事实并非如此。
Comet,正如@kanaka 所说,是一组模拟客户端和服务器之间双向通信的原则(服务器推送是解决方案的一半,现在由服务器发送事件和事件源 API 提供)。
但是,Comet 解决方案是 hack,因为它们在 Web 浏览器中的工作方式不一致。出于这个原因,Alex Russell 说:
接下来,Web Sockets 是 Comet 的一种形式吗?或者 Comet 只是 HTTP 黑客?我会选择后一个定义。这句话和黑客应该一起骑到日落。我,一方面,欢迎我们的非 HTTP 实时霸主。在某种程度上我们可以忘记旧浏览器(上帝知道我正在尽我的一份力:http://google.com/chromeframe),我们都可以加入“Web Sockets”,并且不再需要任何特定的保护伞。
所以让我们专注于:我们如何让用户进入闪亮的新浏览器汽车?关于基于 WebSockets 的应用程序可以提供的丰富性和实时体验,我们可以向他们提供什么样的提议?彗星是关于过去的。让未来成为现实。
我现在和 Alex 一起讨论这个问题。然而,Comet - HTTP 解决方案 - 不会过时,直到:
-
浏览器支持是 100%,我们不需要
防病毒制造商(例如 Avast!)开始支持 HTML5 网络技术,并停止他们的软件干扰连接。
更新了一些 Internet 基础设施以确保对 WebSockets 的支持。根据我的经验,通过 443 端口(安全的 WebSocket 连接)通过 WSS 连接通常意味着连接会通过防火墙和代理,但我们也希望始终支持 80 端口上的 WS。
【讨论】:
原来我们不想再使用80端口了,是不是?【参考方案4】:虽然 WebSocket 确实在最基本的层面上提供了一种在 Web 和 HTTP 上下文中在客户端和服务器之间进行双向通信的方式,但它是一种简单的通信形式。
Comet 在 WebSocket 之上提供了更多的功能(事实上,cometd 甚至支持 websocket),对于特性:
例如发布/订阅和通信渠道 当 websocket 不可用时回退到旧客户端服务器通信技术【讨论】:
Cometd 项目提供了这些东西(或者更具体地说,cometd 是定义这些东西的 Bayeux 协议的实现)。 Comet 一词本身是一组用于进行服务器推送的原则,并没有定义诸如发布订阅、故障转移、频道等之类的东西以上是关于Comet 现在是不是已经过时了 Server-Sent Events 和 WebSocket? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章