Solana数据流:如何使用实时数据驱动你的DApp

  • syndica
  • 发布于 2024-10-16 11:41
  • 阅读 37

本文探讨了Solana上数据流的不同方法,从原生WebSocket到Geyser插件和Syndica的ChainStream API等高级解决方案。

Solana 通过交易、账户更新和其他事件生成大量数据,因为它是一个高吞吐量的区块链。开发者可以从 Solana 节点和其他 API 服务流式传输这些数据,以构建最高效、可扩展和响应最快的应用程序。

本指南探讨了在 Solana 上流式传输数据的各种方法,从原生 WebSocket 方法到高级解决方案,如 Geyser 插件和专用 API。我们将研究何时使用不同的流式传输技术,深入研究可用的工具,并提供在 Solana 应用程序中实现数据流式传输的实用见解。

什么是流式传输?

流式传输指的是实时数据在生成时进行连续流动和处理。流式传输通过重新调整数据摄取和处理方式以实时处理数据增量,从而实现高效、低延迟的数据管道和工作流程。这些性能优化对于高吞吐量和时间敏感型应用(如金融交易所、物联网网络和许多现代 Web 应用)至关重要。

流式传输作为数据处理模型

作为一种数据处理模型,流处理通常与 批量处理 形成对比,后者涉及先收集一段时间的数据,然后再同时处理所有数据。虽然批量处理对于深入分析和处理大型数据集很有用,但它通常会导致更高的延迟,因为数据只有在累积后才会被分析。

对于构建在 Solana 上的应用程序,批量处理和流处理可能适用于不同的用例。批量处理最适合需要历史数据分析和大规模聚合的场景。例如,一个分析 DeFi 协议过去一年交易的仪表板可能会使用批量处理,每 24 小时聚合最新一天的数据并将其添加到报告中。

另一方面,由于区块链的高吞吐量以及应用程序需要连续、实时地处理许多链上事件,流式传输数据可能特别有利。

例如,对于像 Sniper 这样的 NFT 交易平台,正如我们在 案例研究 中看到的那样,流式传输确保 NFT 的上架、下架和销售在各种市场上实时处理。这使用户能够观察并立即对变化的市场条件做出反应。通过利用流式传输,Solana 上的应用程序可以在处理快速涌入的交易和事件时保持响应性和可扩展性。

何时在 Solana 上流式传输数据

确定是否使用流式传输来检索 Solana 上的数据,取决于你的用例所依赖的特定链上事件以及所需的响应速度。值得回顾一下在 Solana 上检索事件数据的不同方法,以及这些方法支持的相应设计模式。

Solana 上的数据检索

Solana 应用程序通常使用远程过程调用 (RPC) 来读取和写入 Solana 区块链中的数据。有关 Solana RPC 的全面概述,请参阅我们之前关于 了解 Solana RPC 的博文。Solana 的原生 RPC 方法使用基于 HTTP (请求和响应) 的协议或 WebSocket (订阅) 协议。

Syndica 等 RPC 提供商提供弹性节点架构,该架构可自动扩展 RPC 节点,并可在它们之间进行负载均衡请求。此架构专门为 Solana RPC 而设计。

应用程序可能需要处理多种类型的链上事件。它们通常可以分为三类:

  • 交易和日志: 交易涉及账户执行指令的操作,通常会输出日志作为副产品。日志记录可以验证特定操作或实时监控状态更改。

示例:例如,getTransaction HTTP 方法返回特定历史交易的交易详情。另一方面,订阅 logsSubscribe WebSocket 方法允许客户端实时流式传输交易日志,因为它们发生在链上。

  • 插槽和区块: Solana 通过在称为插槽的短时 (~400ms) 时间窗口内处理交易区块来运行。监控插槽和区块数据对于需要跟踪区块链的进展、验证确认或同步状态更改的应用程序非常重要。

示例:getSlot HTTP 方法返回由 Solana 验证器确认的最新插槽号。WebSocket 方法 slotSubscribe 允许你在验证器确认每个插槽时流式传输每个插槽的通知。

  • 账户更新: Solana 账户可以根据交易频繁更新。跟踪这些单独的更新对于依赖于账户状态的应用程序至关重要。

示例:getAccountInfo HTTP 方法返回与特定账户关联的最新信息。当给定账户的公钥的 lamports 或数据发生更改时,accountSubscribe WebSocket 方法将流式传输通知。

正如你所看到的,在 Solana 上的原生 RPC 方法中,只有 WebSocket RPC 方法 可用于流式传输链上事件。但是,必须注意的是,基于 HTTP 的方法也可以用于使用轮询设计模式 监听 链上事件。

流式传输与轮询事件数据

轮询可能更适合不需要低延迟且可以容忍一些延迟的场景。例如,考虑监控简单账户更新事件的用例,例如当特定账户的 SOL 余额发生变化时。你可以使用流式传输或轮询方法。下面,我们对比这两种方法。

流式传输方法

当给定账户的 SOL 余额 (或账户数据) 发生变化时,accountSubscribe WebSocket 方法可以接收通知。客户端建立与 Solana RPC 节点 (或 RPC 提供商 API) 的 WebSocket 连接,并请求订阅以使用此方法。

  • 优点:
    • 低延迟: 事件和通知之间的最短时间。
    • 网络效率: 没有冗余请求,可能更容易扩展到更高的吞吐量。
    • 事件驱动: 在事件发生时接收事件自然地融入更大的事件驱动架构中。这种架构模式在围绕微服务构建的现代应用程序中很常见,在这些应用程序中,其他服务可以在事件数据到达后立即使用它。

  • 缺点:
    • 复杂性: 管理 WebSocket 连接生命周期 (打开、订阅、关闭、重新连接、超时等) 比发出简单的一次性 HTTP 请求更复杂。
    • 可扩展性: 可扩展性可能会受到限制,具体取决于特定 WebSocket 方法的实现方式。例如,accountSubscribe 每次订阅只能订阅一个账户,因此,需要管理多个账户的许多并发订阅。
    • 中断: WebSocket 连接可能会中断,从而导致错过通知的可能性。可能需要额外的流、验证或回填来使流具有容错能力。

轮询方法

使用 getBalance HTTP 方法返回账户的最新 SOL 余额。在轮询设置中,客户端定期 (例如,每 30 秒) 发出新的 HTTP 请求以检查余额是否已更改。

  • 优点:
    • 简单性: 可以更容易地实现和理解;涉及简单的 HTTP 请求和重试以解决间歇性错误。
    • 控制: 可以更好地控制何时以及多久检查一次数据。
  • 缺点:
    • 有限的粒度: 轮询仅捕获发出请求的特定插槽的状态,这意味着不会捕获轮询间隔之间的任何中间状态。
    • 冗余请求: 如果账户的状态没有不断变化,那么某些时间段的请求将是冗余的。

选择流式传输方法还是轮询方法取决于你的应用程序的需求以及你希望如何在延迟、复杂性和资源消耗之间取得平衡。

在上述示例的上下文中,交易机器人可能需要尽快对随着时间推移发生的每个账户余额变化做出反应,因此流式传输可能是一个更好的选择。另一方面,显示用户钱包余额的前端 Web 组件可能只需要账户在合理间隔内的最新余额,这使得轮询成为自然的选择。

虽然原生 WebSocket RPC 方法允许在 Solana 上进行基本的数据流式传输,但它们存在重大缺陷,例如有限的事件类型和可扩展性。为了克服这些障碍,开发人员可能会探索更高级的解决方案,例如 Geyser 插件。

Geyser 插件

什么是 Geyser 插件?

Solana 中的 Geyser 插件是一种模块化扩展,旨在简化验证器处理的区块链数据的流动。 solana-geyser-plugin-interface 允许创建直接从验证器客户端重定向链上数据的插件,包括账户信息、插槽、区块和交易。

开发人员可以使用该接口创建自定义插件,从而促进高效灵活的数据流式传输到各种外部系统。使用 Geyser 插件的主要缺点是其设置和维护的复杂性。要有效利用 Geyser 插件,你必须在 Solana 验证器节点上运行它。

Geyser 插件接口

GeyserPlugin trait 定义了用于创建与 Solana 验证器运行时交互的自定义插件的接口。实现此 trait 的插件可以配置日志记录、处理初始化和清理任务,并指定他们想要通过启用方法接收的数据类型。关键回调提供有关账户更改、交易处理、PoH 条目信息和区块更新的信息,使插件能够在通过验证器的数据流中对详细的区块链数据采取行动。

为了保持灵活性和面向未来,该 trait 使用版本化的数据结构来处理账户、交易和区块,从而确保即使在底层数据格式发生演变时也能保持兼容性。此外,一组标准化错误允许插件一致地处理常见问题,例如配置失败或数据更新错误。

具有正确 Geyser 插件的验证器可以为所有下游服务和应用程序提供实时 Solana 数据。

开源 Geyser 插件

以下是值得注意的开源 Geyser 插件和相关工具的摘要,每个插件都提供用于流式传输和管理 Solana 区块链数据的独特功能。

Yellowstone Dragon's Mouth (yellowstone-grpc) : 这为 Solana 提供了一个 gRPC 接口,允许开发人员通过高级控制从验证器流式传输实时区块链数据。它支持多种编程语言,提供高级过滤,并包括维护持久连接的功能。

solana-accountsdb-plugin-postgres : 这将账户和交易数据直接流式传输到 PostgreSQL 数据库中,使开发人员能够使用 SQL 存储和查询区块链数据。功能包括连接池、多线程操作、批量插入、可自定义的数据选择、历史账户跟踪和安全的 SSL 连接。提供模式管理脚本,并用作创建自定义 Solana 数据集成插件的参考。

solana-accountsdb-plugin-bigtable: 这将 Solana 区块链数据直接流式传输到 Google Cloud Bigtable 中,从而将实时数据与 Google 的可扩展 NoSQL 数据库集成。通过连接池和数据压缩提供可自定义的账户选择和针对高吞吐量和低延迟的优化。

Waverider: 这种 Solana Geyser 插件将账户数据流式传输到 PostgREST 服务器。PostgREST 通过在 PostgreSQL 上提供 RESTful API 来简化流程,从而允许通过熟悉的 SQL 查询和 HTTP 请求进行数据管理。

solana-accountsdb-sqs Plugin: 这将 Solana 账户和交易数据直接流式传输到 Amazon SQS,从而将区块链数据集成到 AWS 服务中。通过数据压缩处理 SQS 有效负载大小限制,并通过 Redis 提供高级筛选器和实时配置更改,而无需重新启动验证器。

Digital Asset Validator Plugin: 此插件提取和流式传输用于数字资产管理的 Solana 区块链数据,作为 Metaplex 数字资产 RPC API 的核心组件。它是消息总线无关的,使用 FlatBuffers 进行高效序列化,并最大限度地减少验证器上的负载,从而实现高性能数据流式传输。

quic_geyser_plugin: 此插件使用 QUIC 协议和 HTTP/3 增强了来自 Solana 验证器的数据流式传输,从而实现对实时区块链数据的高速、低延迟访问。优于传统的 TCP 方法,并允许客户端使用特定筛选器自定义数据订阅。

Holaplex Indexer: 这结合了链上和链下数据处理,以提供对 Solana 区块链信息的快速访问,尤其适用于 NFT 生态系统。索引器还通过 Geyser 插件使用数据,对其进行处理并将其存储在 PostgreSQL 中,并通过 GraphQL API 公开丰富的数据。

solana-accountsdb-plugin-kafka: 这将 Solana 数据流式传输到 Kafka 主题中,从而利用 Kafka 的分布式流式传输和处理功能。它提供用于精确数据控制的高级筛选和消息包装,并且高效运行而不会影响验证器性能。

如果你想将 Solana data 集成到你的系统中或增强实时数据处理,那么探索这些插件是一个很好的起点。但是,请记住,运行验证器节点并维护基础设施以有效地支持数据从 Geyser 插件传输出来,将涉及更多的硬件、开发时间和维护。我们建议你研究用于流式传输数据的 API 解决方案,以简化设置并将时间集中在构建核心应用程序上。

ChainStream API

总而言之,在 Solana 上流式传输数据的标准方法是原生 Solana WebSocket RPC 方法或 Geyser 插件。但是,两者都存在严重的局限性:原生 WebSocket 方法仅允许有限范围的事件和通知格式,而 Geyser 插件可能涉及更多的基础设施设置和维护工作。

开发人员可以利用 Solana 基础设施提供商的自定义 API 来实现两全其美:简易性、灵活性和可扩展性。在本节中,我们将介绍 Syndica 的 ChainStream API,我们高度可靠、高吞吐量的数据流式传输解决方案。

什么是 ChainStream API?

ChainStream API 利用 RPC PubSub WebSocket,允许应用程序订阅并接收有关各种区块链活动的即时更新,包括交易、插槽和区块更新。主要功能包括:

  • 可靠性:ChainStream 通过整合来自多个验证器的更新来确保高可靠性。此聚合过程保证不会错过任何通知,这对于高可用性至关重要的应用程序尤其有价值。
  • 可扩展性:该 API 由 Syndica 一流的 Web3 基础设施提供支持。ChainStream 使用弹性节点架构进行扩展,使应用程序可以轻松地扩展其流式传输吞吐量。
  • 灵活的筛选:ChainStream 支持订阅不同类型的链上事件,并为通知提供灵活的筛选选项。开发人员可以为精确筛选单个流中的账户密钥指定多个 all/any/none 标准。
  • 实时日志记录和分析:ChainStream 用户可以利用 Syndica 平台进行实时日志记录和分析。开发人员可以访问连接、订阅和通知活动的详细视图,从而更轻松地优化应用程序性能并了解活动。

如何使用 Chainstream API

ChainStream 支持订阅以下类型的通知,因为它们由验证器在链上处理:

  1. 交易通知: 流式传输完整交易数据 (指令、余额、日志等)
  2. 插槽通知: 流式传输插槽的更新,因为它们达到更高的提交级别 (已处理、已确认、已完成)
  3. 区块通知: 即将推出,流式传输高级区块信息 (奖励、交易计数等)

要创建订阅,请使用 JSON-RPC 2.0 规范自定义你希望接收的通知类型。

例如,此示例 JSON-RPC 请求订阅具有多个筛选选项的交易通知:

{
    "jsonrpc": "2.0",
    "id": 123,
    "method": "chainstream.transactionsSubscribe",
    "params": {
        "network": "solana-mainnet",
        "verified": true,
        "filter": {
            "excludeVotes": false,
            "accountKeys": {
                "all": [\
                    "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg",\
                    "4fYNw3dojWmQ4dXtSGE9epjRGy9pFSx62YypT7avPYvA"\
                ],
                "oneOf": [\
                    "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg",\
                    "4fYNw3dojWmQ4dXtSGE9epjRGy9pFSx62YypT7avPYvA"\
                ],
                "exclude": ["BGsqMegLpV6n6Ve146sSX2dTjUMj3M92HnU8BbNRMhF2"]
            }
        }
    }
}

network: 初始参数网络指定你要订阅以接收更新的 Solana 网络 (例如,solana-mainnet)。

verified: 通过将 verified 设置为 true,API 将仅发送由多个验证器验证的通知。此选项将在通知中引入一个插槽延迟,但会消除来自单个验证器的任何噪声通知。

filter: 各种可选筛选器允许你自定义订阅:

  • excludeVotes: 设置为 false 时,投票交易将包含在通知中。将其设置为 true 将排除它们。
  • accountKeys: 此筛选器可用于指定你感兴趣的账户密钥:
    • all: 要求所有列出的账户密钥都出现在交易中。
    • oneOf: 至少应存在一个列出的账户密钥。
    • exclude: 将排除包含指定账户密钥的交易。

你的 ChainStream 订阅的日志记录和指标可以轻松地在 Syndica 平台上访问:

有关完整示例,请参阅 ChainStream API 文档:https://docs.syndica.io/platform/chainstream-api

结论

在 Solana 上构建应用程序的开发人员应该首先熟悉可用的流式传输选项,从原生 WebSockets 到高级解决方案,如 Geyser 插件和 API (如 ChainStream)。从简单的轮询方法或基本的 WebSocket 订阅开始,以使你的应用程序运行起来。

随着你对可扩展性和实时数据的需求增长,请探索提供更高吞吐量、灵活性和可靠性的更复杂的工具。关键是将流式传输解决方案的复杂性与应用程序不断变化的需求保持一致,从而确保效率和易于维护。

Syndica 赋能推进 Solana 生态系统的主要企业和架构师。在构建 Web3 云时,我们提供一流的 RPC 节点基础设施、开发者 API、强大的端到端平台以及下一个前沿的 Solana 客户端验证器 Sig,用 Zig 编写。我们的团队提供专门的支持、可靠性和以用户为中心的导向,以实现与 Solana 的无缝集成,使你可以专注于构建你的企业。

立即在 syndica.io 免费开始,并在此处查看我们的文档 here

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

0 条评论

请先 登录 后评论
syndica
syndica
News & research from Syndica: low latency Solana RPC, data streams, Sig Validator & more