使用 Server-sent Events 实现实时订单处理系统

阅读时长 4 分钟读完

在 Web 应用程序中,有时需要在服务器端发出实时通知,以便客户端接收并处理数据。这类通知通常被称为服务器推送 (Server Push) 或一些 Websockets 技术。然而,对于一个简单的 Web 或移动应用程序,使用 Ajax 轮询的方式来获取实时数据是一种更简单、更便宜的方式。

Server-sent Events (SSE) 是一种在浏览器和服务器之间提供实时通知的技术。不同于采用轮询的方式,SSE 让服务器始终保持打开状态,通过一个 HTTP 连接不断地向浏览器推送消息。当客户端连接上服务器并开始监听 SSE 的时候,一旦服务端有新的数据产生,SSE 协议会自动将数据推送给浏览器端进行处理,从而实现实时订单处理系统。

SSE 的优势

相较于其他实时通知技术,SSE 有以下优势:

  • SSE 使用简单:相较于 WebSockets 技术或其他一些推送技术,SSE 的使用十分容易,只需要开启一个 http 连接即可。
  • SSE 具有更高的兼容性:相较于其他推送技术,SSE 的兼容性较高,只有一些旧的浏览器不支持 SSE。
  • SSE 实时通知的延迟小:SSE 有缓存机制,可以确保实时信息的当时推送,即时性更强。

SSE 的使用方式

下面我们将介绍如何使用 SSE 实现一个实时订单处理系统。

服务端

服务端使用 SSE 的时候需要设置 HTTP Content-Type + text/event-stream。并且需要保持响应的打开状态,不断地向客户端发送消息。下面是示例代码:

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

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

在代码中我们创建了一个 /orders 的路由,在该路由下,我们设置响应的 Content-Type 为 text/event-stream,并且通过 HTTP 报头中 Connection: keep-alive 的方式,保持连接打开,使得服务端可以不断地向客户端发送消息。在 setInterval 里面我们向客户端发送 event 类型为 order-update 的消息,数据为随机数。

客户端

在客户端中我们需要创建一个 EventSource 对象,对服务端的 SSE 响应进行监听。当服务端推送消息的时候,客户端会收到 message 事件,我们可以通过消息的 event 字段和 data 字段来进行数据处理。下面是示例代码:

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

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

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

在代码中我们创建了一个 EventSource 对象,并为其添加两个监听器。一个监听器用于监听 order-update 事件,用于处理数据,并在控制台上展示。另一个监听器用于处理服务器连接关闭事件。

总结

通过本文的介绍,我们了解了 SSE 的优势,以及如何使用 SSE 实现一个实时订单处理系统。除此之外,SSE 还可以进行私有通信、实时日志等应用场景。在 Web 应用程序开发中,SSE 技术将会有着更广泛的应用。

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

纠错
反馈