2015-07-10 85 views
0

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

我使用的是Faye红宝石宝石,我注意到它使用了Comet/Bayeux开箱即用。但我找不到它使用的彗星技术。我只是认为Bayeux是发布 - 订阅协议。我很想知道它是否存在HTTP流和长轮询的缺点。它是否允许全双工通信(双向通信,并且与半双工不同,允许同时进行)?

回答

0

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

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

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

Bayeux protocol是传输协议(如HTTP或WebSocket)之上的应用程序协议。

HTTP是单个请求/响应交换环境中的全双工协议。多个HTTP交换序列化(即,一个接一个地执行)。 HTTP请求/响应交换是序列化的单位。

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

Bayeux继承了传输协议的特性。 Bayeux协议本身本身并不具有任何“双工”特性,您可以将它看作是以特定文本格式格式化消息的一种方式。

CometDFaye通过WebSocket和HTTP长轮询都使用Bayeux。

+0

Comet如何不会导致像apache2这样的http服务器崩溃,因为这么多打开的tcp连接会消耗内存。我的意思是,如果你有64,000个开放的tcp连接,每个连接1mb,那仅仅是64GB的内存,肯定会导致大多数服务器崩溃。 – Donato

+0

单独的tcp连接不会消耗1 MiB的内存。这是与该连接关联的线程消耗该MiB。这就是为什么apache2不适合长时间轮询的服务器。其他服务器,如[Jetty](http://eclipse.org/jetty)(其支持[CometD](http://cometd.org)),nginx等能够维持数万个连接而不消耗很多内存,因为它们在这种情况下使用异步I/O和线程更有效。在达到内存限制之前,我能够将400,000个CometD客户端连接到单个CometD/Jetty服务器。 – sbordet

+0

感谢您的美妙回馈。我正在使用apache2,但在阅读您的意见后,它是nginx。 – Donato