0

我有React web applicationREST API (Express.js)

我发现如果您不想使用长轮询或套接字(无需发送数据客户端->服务器),使用 EventStream 是更好的选择。

用例:

  1. 用户打开页面,其中是空表,其他用户可以在其中添加数据POST /data
  2. 该表由来自 API 的初始数据填充GET /data
  3. 然后页面连接到 EventStream/data/stream并监听更新
  4. 有人添加新行和表需要更新...

是否可以从后端(用于添加行的控制器)向所有连接的用户广播此更改(添加的新行)/data/stream

4

2 回答 2

1

获取初始数据,然后使用单独的实时流进行更新通常不是一个好习惯。这是因为在初始获取和实时更新流之间有一个数据可以到达服务器的窗口。

通常,这意味着您要么错过消息,要么获得发布到两者的重复消息。您可以通过跟踪某种 id 或序列号来消除重复,但这意味着额外的编码和计算。

SSE 可用于单个流上的初始获取和实时更新,避免上述同步挑战。

客户端创建一个EventSource启动 SSE 流。服务器以已经存在的数据进行响应,然后发布到达服务器的任何新数据。

如果需要,服务器可以在每条消息中包含一个事件 ID。然后,如果客户端断开连接,SSE 客户端将自动重新连接last-event-id,并且数据流从中断处恢复。在客户端,自动重新连接和恢复last-event-id是自动的,因为它是由标准指定的。开发人员无需执行任何操作。

SSE 有点像 HTTP / REST / XHR 请求,它保持打开状态并继续流式传输数据,因此您可以两全其美。该 API 是轻量级、易于理解且基于标准的。

于 2019-09-23T16:30:24.873 回答
0

我会试着回答自己:)

我从没想过我可以在后端使用任何发布/订阅系统。每个连接到流(/data/stream)的用户都被订阅,服务器将在接收到新行时发布POST /data

于 2019-09-20T18:28:42.293 回答