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

Bidirectional client-server communication using Server-Sent Events instead of WebSockets?

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

已经提到here that SSE with AJAX would have higher round-trip latency and higher client->server bandwidth since an HTTP request includes headers and that websockets are better in this case, however isn't it advantageous for SSE that they can be used for consistent data compression, since websockets' permessage-deflate supports selective compression, meaning some messages might be compressed while others aren't compressed

是的,有可能。

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

在这种情况下,您最好的选择是使用 WebSockets 服务器,因为从头开始构建 WS 实现不仅 time-consuming 而且它已经解决的事实使其毫无用处。正如您已标记 Socket.io,这是开始的不错选择。它是一个开源工具,易于使用和遵循文档。

但是,由于它是 open-source,因此当您想在生产级应用程序中流式传输数据时,它不提供一些至关重要的功能。存在诸如可伸缩性、互操作性(对于在 WebSockets 以外的协议上运行的端点)、容错、确保可靠的消息排序等问题

real-time 消息传递基础设施加上上面提到的这些关键生产级功能作为称为 'Data Stream Network' 的服务提供。有几家公司提供此服务,例如 Ably、PubNub 等。

我已经与 Ably 广泛合作,很高兴在 Node.js 中分享一个使用 Ably 的示例:

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");

您可以创建一个免费帐户来获得一个 API 密钥,每月有 300 万条免费消息,应该足以正确试用 afaik。

还有一个概念Reactor functions,本质上是在AWS、Azure、Gcloud等上实时调用无服务器功能。你也可以在一侧放置一个数据库,并在数据到达时记录数据。粘贴在 Ably 网站上找到的这张图片以获取上下文:

希望对您有所帮助!