创建可伸缩的 Server-sent Events(SSE)客户端的最佳实践

阅读时长 4 分钟读完

在 Web 应用程序中,我们经常需要实时更新数据,例如聊天室、实时报价等。 Server-sent Events(SSE)是一种实时通信技术,它允许服务器向客户端发送事件,以便在服务器端检测到更新时即时通知客户端。

SSE 是一种基于 HTTP 的协议,它允许在不刷新页面的情况下,通过单个持久连接从服务器向客户端推送数据。

借助 EventSource API

在前端中创建 SSE 客户端最佳实践是使用 EventSource API,该 API 允许通过服务器发送事件流更新客户端。以下是一个基本的 SSE 客户端示例代码:

-- -------------------- ---- -------
----- ----------- - --- -----------------------------------

--------------------- - ------- -- -
  ----- ---- - -----------------------
  -- ------
--

------------------- - ------- -- -
  ---------------------
  --------------------
--

在上述示例中,我们创建了一个连接到 /server_sent_events 的事件源并设置 onmessage 回调来处理每个消息。

另外,我们还设置了 onerror 回调,以及调用 eventSource.close() 来关闭连接。这个是一个很好的实践,在代码中始终关闭 SSE 连接是十分重要的。

处理 SSE 事件

当接收到服务器端发出的事件时,它们将以 event 的形式传递到 onmessage 回调函数中。每个事件对象包括以下三个属性:

  • event.data:事件数据;
  • event.lastEventId:包含最后事件 ID 的字符串;
  • event.type:事件类型。

以下是一个示例 SSE 事件:

在上述示例中,我们定义了一个 new_event 类型的 SSE 事件。 id 常用来跟踪事件流,以防某些事件丢失。

最后我们解析 JSON 数据并用它来处理事件。

处理 SSE 重新连接

在实际开发中,经常需要处理 SSE 连接断开和重新连接的情况。下面是一个处理 SSE 重新连接的示例:

-- -------------------- ---- -------
--- ----------- - -----

-------- --------- -
  ----------- - --- -----------------------------------
  
  --------------------- - ------- -- - -- ---- --

  ------------------- - ------- -- -
    ---------------------
    --------------------
    ---------- -- --- ---------
  --
-

---------- -- --- --- --

在上述代码中,我们使用递归方式处理 SSE 连接出错的情况,如果连接出错,则立即关闭连接并尝试重新连接。

消息队列和 SSE

在实际使用中,我们可能需要将 SSE 结合到消息队列中以进行更复杂的应用程序。例如,如果要显示流程图或其他图表,则可以将图表数据推送到消息队列中。这样,客户端就可以有效地处理数据并生成图表,而不用等待每个 SSE 事件都完成。

以下是一个示例代码,它创建一个 SSE 客户端来接收包含图表数据的 SSE 消息:

-- -------------------- ---- -------
----- ----------- - --- -----------------------------------

----- --------- - --- -- -----------

--------------------- - ------- -- -
  ----- ---- - -----------------------
  --------------------- -- -----------

  -- --------
  -- ---------------------
--

------------------- - ------- -- -
  ---------------------
  --------------------
--

在上述代码中,我们在接收到 SSE 事件时将数据添加到消息队列中。请注意,我们必须在 onmessage 回调函数中处理消息队列数据,以确保 SSE 客户端处理数据的顺序正确。

总结

Server-sent Events(SSE)是一种强大的实时通信技术,在 Web 应用程序中有很多实用的场景。在前端中创建 SSE 客户端,使用 EventSource API 是最佳实践。为了使 SSE 客户端具有可伸缩性并能够处理 SSE 重新连接和消息队列数据,需要使用适当的最佳实践和代码示例。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e7b718f6b2d6eab333a879

纠错
反馈