【问题标题】:EventStreams (SSE) - Broadcasting updates to clients. Is it possible?EventStreams (SSE) - 向客户端广播更新。是否可以?
【发布时间】:2019-09-20 16:59:14
【问题描述】:
我有React web application 和REST API (Express.js)。
如果您不想使用长轮询或套接字(无需发送数据客户端->服务器),我发现使用 EventStream 是更好的选择。
用例:
- 用户打开的页面是空表,其他用户可以通过
POST /data添加数据。
- 此表由
GET /data 填充来自API 的初始数据。
- 然后页面连接到
/data/stream 上的 EventStream 并监听更新
- 有人添加新行和表需要更新...
是否可以从后端(用于添加行的控制器)向所有连接到/data/stream 的用户广播此更改(添加的新行)?
【问题讨论】:
标签:
node.js
rest
express
event-stream
【解决方案1】:
获取初始数据,然后使用单独的实时流进行更新通常不是一个好习惯。这是因为在初始获取和实时更新流之间存在一个数据可以到达服务器的窗口。
通常,这意味着您要么错过消息,要么获得发布到两者的重复消息。您可以通过跟踪某种 id 或序列号来消除重复项,但这意味着额外的编码和计算。
SSE 可用于单个流上的初始提取和实时更新,避免上述同步挑战。
客户端创建一个EventSource 来启动一个 SSE 流。服务器以已经存在的数据进行响应,然后发布到达服务器的任何新数据。
如果您愿意,服务器可以在每条消息中包含一个事件 ID。然后,如果客户端断开连接,SSE 客户端将自动与last-event-id 重新连接,数据流将从中断处恢复。在客户端,自动重新连接和从last-event-id 恢复是自动的,因为它是由标准指定的。开发者无需做任何事情。
SSE 有点像 HTTP / REST / XHR 请求,它保持打开状态并继续流式传输数据,因此您可以两全其美。该 API 是轻量级、易于理解且基于标准的。
【解决方案2】:
我会尽量回答自己:)
我从没想过我可以在后端使用任何发布/订阅系统。每个连接到流 (/data/stream) 的用户都被订阅,服务器将在收到来自 POST /data 的新行时发布。