使用 LaserStream SDK 实现高性能 Solana 流式传输

  • Helius
  • 发布于 1天前
  • 阅读 141

LaserStream 是一个下一代 gRPC 流媒体服务,专为最低延迟的 Solana 数据传输而优化。它通过自动重连、基于槽的回放和高吞吐量架构提供可靠的流式传输,而不会影响超低延迟。该 SDK 使用 Rust 核心和零拷贝 NAPI 绑定来优化 JavaScript SDK 性能,与标准 JavaScript Yellowstone 客户端相比,速度提高了 40 倍。

LaserStream 是一种下一代 gRPC 流式传输服务,针对最低延迟的 Solana 数据传输进行了优化。它与 Yellowstone gRPC 接口保持完全的向后兼容性,作为一个直接替换方案,只需要修改 endpoint 和 x-token,无需修改代码。

DFlow 等领先团队使用 LaserStream 以无与伦比的速度和可靠性来支持实时订单流和执行监控,详情请参见他们的案例研究

这种兼容性意味着开发者可以无缝地迁移现有的 Yellowstone 实现。但是,标准的 Yellowstone 客户端缺少内置的性能优化和可靠性功能。

LaserStream SDK 解决了这些差距,提供了自动重连、基于 slot 的重放以及为苛刻的工作负载设计的高吞吐量架构——在不妥协的情况下提供可靠性和超低延迟的流式传输。

通过重连和重放实现可靠的流式传输

所有三个 LaserStream SDK——JavaScript/TypeScript、Rust 和 Go——都在处理高带宽流式传输中的一个关键挑战:在网络中断期间保持数据的连续性。

每个 SDK 都实现了带有 slot 跟踪的自动重连。当连接断开时,客户端会在内部跟踪最后处理的 slot。

重新连接后,它会从该确切点恢复,请求最多 3,000 个 slot(约 20 分钟)的历史重放

这种架构可以防止临时服务器端断开连接时的数据丢失,而无需应用程序级别的重试逻辑。

slot 跟踪器将处理的 slot 号存储在内存中。当 replay: true(默认)时,SDK 保证你的数据流中没有间隙。某些部署,特别是专用节点,不支持历史重放。对于这些 endpoint,请设置 replay: false 以禁用内部 slot 跟踪,并在重新连接时从当前 slot 恢复。

gRPC 流中的 JavaScript 性能瓶颈

Node.js gRPC 流遇到实际的瓶颈,这些瓶颈在高容量负载下变得至关重要。问题不是理论上的;而是关于当你的回调处理每个消息时会发生什么。

JavaScript 的单线程事件循环意味着数据处理程序中的每个操作(例如,解析 JSON、验证数据、运行业务逻辑、事件日志记录等)都会阻止后续消息。

当消息到达的速度快于处理程序处理它们的速度时,流会滞后,背压会增加,回调会排队,并且你的应用程序会处理越来越过时的数据。

纯 JS gRPC 客户端通过额外的开销来加剧这种情况:

  • 在 JavaScript 中进行 Protobuf 反序列化
  • 对象分配带来的垃圾回收压力
  • 反复跨越 JavaScript/本地边界进行网络 I/O

对于每秒处理数千个帐户更新或交易通知的应用程序(例如 MEV 基础设施、实时分析或订单簿跟踪),这些延迟会侵蚀任何竞争优势。你的系统正在对几秒钟前已经发生的事件做出反应。

使用 Rust 核心和零拷贝 NAPI 绑定来优化 JavaScript SDK 性能

LaserStream JavaScript SDK 通过将昂贵的操作完全移出 JavaScript 来解决这些瓶颈。

整个流式传输引擎、gRPC 连接管理、protobuf 序列化和 slot 跟踪都在 Rust 中运行。只有你的应用程序逻辑在 JavaScript 中运行。

这种架构解决了核心问题:

  1. 网络 I/O 和 protobuf 反序列化永远不会触及 JavaScript 事件循环。
  2. Rust 层在单独的线程中处理所有消息处理。
  3. Rust 层通过 NAPI (Node-API) 绑定将预序列化的 protobuf 字节传递给 JavaScript 回调。

以下是 LaserStream JavaScript SDK 的工作原理图:

使用 Rust 核心和 NAPI 绑定构建 LaserStream SDK 的图表

NAPI 绑定为流式传输更新提供零拷贝数据传输。当 LaserStream 发送 protobuf 消息时,Rust 层会对其进行反序列化,并在需要时跟踪 slot,然后将原始字节作为 Uint8Array 直接传递给 JavaScript,无需额外的序列化,也无需中间拷贝。

性能差异非常显著:1.3 GB/s vs. 30 MB/s,比标准 JavaScript Yellowstone 客户端快 40 倍

这不是渐进式的改进。这是实时处理完整区块流和落后数分钟之间的区别。

Rust 核心处理:

  • gRPC 连接生命周期和流控制
  • 具有指数退避的自动重连
  • Slot 跟踪和重放逻辑
  • Protobuf 编码/解码
  • 通过有界队列进行线程安全的回调分发(防止回调减慢时的内存膨胀)

JavaScript 处理应用程序逻辑、过滤、业务规则和数据持久性,而无需触及网络 I/O 或序列化瓶颈。

压缩支持

LaserStream 在 gRPC 传输层支持多种压缩算法。与未压缩的流相比,Zstd 压缩可实现 70-80% 的带宽减少,这对于高容量订阅来说至关重要,因为出口成本与数据传输量成线性比例。

压缩配置非常简单:

const config = {
  apiKey: 'your-key',
  endpoint: 'your-endpoint',
  channelOptions: {
    'grpc.default_compression_algorithm': CompressionAlgorithms.zstd,
    'grpc.max_receive_message_length': 1_000_000_000,
  }
};

与 gzip 相比,Zstd 提供了更好的压缩率,且 CPU 开销相当,使其成为推荐的选择。

结论

LaserStream SDK 解决了高性能数据流式传输中的基本挑战。它们保持了 Yellowstone 兼容性,同时添加了标准客户端缺乏的可靠性功能、自动重连和基于 slot 的重放。

对于 JS 应用程序,由 Rust 驱动的架构消除了事件循环瓶颈,这些瓶颈使得纯 JS 实现在大规模情况下不切实际。

40 倍的吞吐量提升不是渐进式的优化。这是在极端负载下实时处理完整区块流和落后数分钟之间的架构差异。

对于延迟和可靠性不是可选项的生产应用程序(MEV 基础设施、实时分析和自动化交易系统),LaserStream SDK 提供了你需要的基础。

其他资源

  • 原文链接: helius.dev/blog/laserstr...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Helius
Helius
https://www.helius.dev/