使用服务器发送事件而不是WebSocket进行双向客户端-服务器通信?

时间:2019-05-13 02:52:26

标签: websocket real-time server-sent-events server-push

如果客户端使用HTTP POST发送消息并使用SSE异步接收消息,则可以使用服务器发送事件(SSE)在客户端和服务器之间实现双向通信。

已经提到here,因为HTTP请求包含标头,并且Websocket在这种情况下更好,所以带有AJAX的SSE具有更高的往返延迟和更高的客户端->服务器带宽。对于SSE而言,其优点是可以用于一致的数据压缩,因为websocket的permessage-deflate supports selective compression, meaning some messages might be compressed while others aren't compressed

2 个答案:

答案 0 :(得分:1)

在这种情况下,您最好的选择是使用WebSockets服务器,因为从头开始构建WS实现不仅费时,而且已经解决了这一事实,因此使其无用。正如标记了Socket.io一样,这是入门的好选择。这是一个开放源代码的工具,易于使用,并可以从文档中获取。

但是,由于它是开源的,因此当您要在生产级应用程序中流传输数据时,它没有提供某些至关重要的功能。存在一些问题,例如可伸缩性,互操作性(针对在非WebSockets协议上运行的端点),容错性,确保可靠的消息排序等。

实时消息传递基础结构以及上面提到的这些关键生产级别功能是作为一种称为“数据流网络”的服务提供的。有多家公司提供此服务,例如Ably,PubNub等。

我与Ably进行了广泛的合作,因此很乐意在使用Ably的Node.js中共享一个示例:

var Ably = require('ably');
var realtime = new Ably.Realtime('YOUR-API-KEY');
var channel = realtime.channels.get('data-stream-a');
  //subscribe on devices or database
  channel.subscribe(function(message) {
  console.log("Received: "  message.data);
});

//publish from Server A
channel.publish("example", "message data");

您可以创建一个免费帐户,以获取每月包含300万条免费消息的API密钥,足以正确尝试afaik。

还有一个Reactor functions概念,它实际上是在AWS,Azure,Gcloud等上实时调用无服务器功能。您也可以将数据库放在一侧,并在数据到达时对其进行日志记录。将此图片粘贴在Ably网站上以获取上下文:

enter image description here

希望这会有所帮助!

答案 1 :(得分:0)

是的,有可能。

您可以打开1个以上的并行HTTP连接,因此没有什么可以阻止您。