streaming real-time ndjson sse websockets data-formats

流式与实时数据格式指南:NDJSON、SSE 及更多

深入了解 NDJSON、JSON Lines 和服务器发送事件 (SSE) 等流式数据格式。探索如何在 Web 应用中高效处理实时数据。

2026-04-15

流式与实时数据格式:实用指南

在现代 Web 开发中,数据不再仅仅是静态文件或单一的 API 响应。实时更新、日志和海量数据集需要流式格式——即在数据到达时立即发送和处理,而不是等待整个负载就绪。本指南将探讨最流行的流式传输和实时通信格式。

1. 行分隔格式 (NDJSON & JSON Lines)

当你需要流式传输对象列表(如数据库记录或日志条目)时,标准的 JSON 数组 [...] 存在问题,因为解析器必须等待结束符 ] 才能开始处理。行分隔格式解决了这个问题。

NDJSON (Newline Delimited JSON)

NDJSON 是一种存储或流式传输数据的标准,其中每一行都是一个有效的 JSON 对象。

  • 工作原理{"id":1}\n{"id":2}\n...
  • 核心优势:一旦接收到换行符 \n,你就可以立即解析并处理每个独立的对象。
  • 应用场景:大型数据库导出、结构化日志记录和数据管道。

JSON Lines (JSONL)

JSON Lines 与 NDJSON 基本相同。它是一种基于文本的格式,每一行都是一个有效的 JSON 值。

  • 核心优势:与 grepawksed 等 Unix 工具具有极佳的兼容性。
  • 应用场景:AI/ML 训练的数据集存储和日志分析。

CSV 流 (CSV Stream)

与 NDJSON 类似,CSV 流逐行发送逗号分隔值。

  • 核心优势:极低的开销。
  • 应用场景:实时将数百万行数据导出为 Excel 兼容格式。

2. 服务器发送事件 (SSE)

服务器发送事件 (SSE) 是一种标准,允许服务器通过 HTTP 向网页推送数据。与 WebSockets 不同,它是一个单向通信通道(服务器 -> 客户端)。

  • 工作原理:服务器保持 HTTP 连接开启,并以特定的 text/event-stream 格式发送数据。
  • 协议格式
    event: user-update
    data: {"name": "Alice"}
    
    event: chat-message
    data: "Hello world!"
    
  • 核心优势:自动重连、轻量级,且通过标准 HTTP/HTTPS 运行。
  • 应用场景:体育赛事实时比分、股票价格走势和社交媒体通知。

3. WebSockets 与消息格式

虽然 SSE 用于单向流式传输,但 WebSockets 提供了一个全双工(双向)通信通道。

WebSocket 消息格式

由于 WebSockets 仅提供传输层,开发人员必须选择消息格式。

  • JSON:最常用的选择,易于使用。

  • 二进制 (Protobuf/MessagePack):在对低延迟和超小负载有严格要求时使用。

  • 自定义文本协议:有时用于简单的命令。

  • 应用场景:实时协作编辑(如 Google Docs)、在线游戏和聊天应用。


流式传输方案对比

格式 / 技术 方向 开销 自动重连 最佳用途
NDJSON / JSONL 单向 不适用 (文件/流) 日志、数据导出
SSE 服务器 -> 客户端 极低 是 (自动) 实时仪表盘
WebSockets 双向 否 (需手动) 交互式应用
CSV 流 单向 极小 不适用 大型报告导出

FAQ:常见问题

Q: 为什么流式传输不直接使用 JSON 数组?

A: 标准的 JSON 解析器是“全有或全无”的。在整个数组关闭之前,它们无法输出对象。NDJSON 允许“增量”解析,从而节省内存并降低延迟。

Q: 什么时候应该使用 SSE 而不是 WebSockets?

A: 如果你只需要服务器向客户端推送数据(如通知),请使用 SSE。SSE 更容易实现,自动处理断开连接,并且比 WebSockets 对防火墙更友好。

Q: 如何在 Node.js 中处理大型 NDJSON 文件?

A: 使用流式解析器(如 readline)或专用的 NDJSON 库。这允许你以极小的、恒定的内存占用处理数 GB 的数据。

相关工具 (Tool3M)