摘要
Solana 项目遇到的瓶颈与 EVM 应用不同:高请求量、WebSocket 订阅以及大量 getProgramAccounts 风格的读取可能会压垮共享的公共端点。本文解释了如何评估 Solana 的 RPC 服务和专用节点访问,包括在承诺之前需要测试什么、如何配置端点以及专用基础设施的适用场景。OnFinality 提供 Solana RPC API 访问和专用节点选项,你可以查看支持的网络和定价来匹配你的工作负载。
Solana 项目很少因为单个慢请求而失败。它们失败的原因是请求量、订阅负载和大量账户读取在共享端点上发生冲突,而该端点从未针对这种模式进行过规模调整。如果你正在为 Solana 项目评估具有专用节点访问的 RPC 服务,有用的问题不是“哪个提供商最好”,而是“哪种访问模式适合我的工作负载,以及我如何在承诺之前验证它?”
本页将引导你完成这一决策:共享和专用访问对 Solana 实际改变了什么、需要测试什么、如何配置端点,以及常见的故障模式出现在哪里。OnFinality 提供 Solana RPC API 访问和专用节点选项,无论你使用 OnFinality 还是其他提供商,相同的评估逻辑都适用。
快速建议:共享、专用还是混合
首先对你的工作负载进行分类。Solana 流量并非均匀,正确的访问模式取决于以下哪种模式在你的请求组合中占主导地位。
| 工作负载模式 | 典型访问模式 | 原因 |
|---|---|---|
| 钱包 UI,偶尔的余额和 blockhash 读取 | 共享 RPC API | 低且突发的量;共享容量通常足够 |
| 具有稳定读取流量和一些订阅的 dApp | 带 WebSocket 的共享 RPC API,外加一个备用端点 | 可预测的量,但仍需要冗余 |
| 具有持续高 RPS 的交易机器人、索引器或后端 | 专用节点 | 你需要一致的容量和与其他租户的隔离 |
大量 getProgramAccounts / getSignaturesForAddress 扫描 | 专用节点,通常具有归档式访问 | 这些调用开销大,会占用共享容量 |
| 大规模实时订阅(许多并发账户) | 带 WebSocket 的专用节点 | 订阅扇出是限制因素,而非原始 RPS |
混合模式很常见:将延迟敏感的读取和订阅路由到专用节点,并保留一个共享端点作为非关键调用的备用。如果你仍在高层面上比较提供商,RPC 提供商选择指南涵盖了通用标准;本文侧重于 Solana 特有的部分。
专用节点访问对 Solana 的改变
共享 RPC 服务将许多客户汇集到一组节点上。专用节点为你的项目提供自己的节点进程(或一组预留资源),这样你的流量就不会与其他租户竞争。
对于 Solana,实际差异在于:
- 容量隔离。 你的大量
getProgramAccounts扫描不会降低另一个项目的流量,他们的流量也不会降低你的。 - 订阅余量。 WebSocket 订阅(
accountSubscribe、logsSubscribe、slotSubscribe)会为每个连接保留服务器端状态。专用容量在你达到连接或订阅限制之前为你提供更多空间。 - 负载下的行为一致。 共享端点在网络范围的高峰期可能表现出延迟波动。专用节点为你提供更稳定的基线,尽管它仍然受 Solana 网络条件的限制。
- 配置控制。 根据提供商的不同,专用访问可能允许围绕索引、保留或 RPC 方法可用性进行调优。
专用访问不能做什么:它不能消除 Solana 网络拥塞,不能使 getProgramAccounts 变得廉价,也不能消除对故障转移的需求。将其视为容量和隔离,而非保证。
Solana 端点设置和连接基础
Solana RPC 使用基于 HTTP 和 WebSocket 的 JSON-RPC。没有像 EVM 网络那样的链 ID 握手;你将客户端指向一个 URL 并调用方法。OnFinality 的公共 Solana 端点可用于测试:
- HTTP:
https://solana.api.onfinality.io/public - WebSocket:
wss://solana.api.onfinality.io/public-ws
一个最小的 JSON-RPC 调用如下所示:
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getLatestBlockhash",
"params": [{"commitment": "confirmed"}]
}'
在 JavaScript 客户端中,通过 @solana/web3.js 进行相同的调用:
import { Connection, clusterApiUrl } from "@solana/web3.js";
const connection = new Connection(
"https://solana.api.onfinality.io/public",
{ commitment: "confirmed", wsEndpoint: "wss://solana.api.onfinality.io/public-ws" }
);
const { blockhash, lastValidBlockHeight } =
await connection.getLatestBlockhash("confirmed");
console.log(blockhash, lastValidBlockHeight);
对于开发和测试,可以使用 Solana Devnet,以便在指向主网之前验证客户端配置。主网 Solana 网络页面列出了当前端点和支持的传输方式。
生产就绪检查清单
在承诺使用 Solana RPC 服务或专用节点之前,请根据你的实际工作负载验证以下项目。不要仅依赖已发布的基准测试;用你自己的请求组合进行测试。
| 检查项 | 需要验证什么 | 为什么重要 |
|---|---|---|
| 方法覆盖 | 你调用的方法是否受支持(包括 getProgramAccounts、getTokenAccountsByOwner、simulateTransaction)? | 一些提供商在共享层级上限制昂贵的方法 |
| WebSocket 支持 | 你能否打开并维持所需数量的订阅? | 订阅限制通常是你遇到的第一个约束 |
| 承诺级别 | 端点是否遵守 processed、confirmed 和 finalized? | 错误的承诺处理会导致读取不一致 |
| 故障转移 | 你能否在不重新部署的情况下切换端点? | 单端点设置在提供商发生事故时会失败 |
| 速率行为 | 当你超过计划的限制时会发生什么? | 硬失败与节流会改变你的重试设计 |
| 可观测性 | 你能否看到请求量、错误率和延迟? | 你无法调整你无法衡量的东西 |
运行一个反映你生产请求组合的负载测试,包括昂贵的调用,并关注错误率和延迟百分位数,而不是平均值。
预期故障模式及如何调试
Solana RPC 问题往往集中在几种可识别的模式中。
- 429 或节流响应。 你超出了计划的请求预算或突发容量。检查你的客户端是否使用退避重试,以及专用节点是否能为你提供所需的余量。
getProgramAccounts超时。 这些调用会扫描大量账户集。如果它们持续超时,你可能需要专用容量或更窄的过滤器(例如,按数据大小或 memcmp 偏移量过滤)。- WebSocket 断开连接。 长期订阅会在网络变化或服务器重启时断开。你的客户端应自动重新连接并重新订阅,并且你应该跟踪每个连接的订阅数量。
- 读取过时或不一致。 在调用中混合承诺级别会产生看起来错误的结果。为每个工作流标准化一个承诺级别。
- 交易提交期间 blockhash 过期。 如果你的交易在提交前停留太久,blockhash 会过期。在接近提交时间时获取新的 blockhash,并处理
lastValidBlockHeight。
一个简单的监控探针可以帮助你及早发现这些问题:
# Check endpoint health and latest slot
curl -s https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot","params":[{"commitment":"finalized"}]}'
按计划运行此命令,并在失败或意外的 slot 滞后时发出警报。
如何评估 Solana RPC 提供商
当你为 Solana 项目比较提供商时,请根据你的工作负载而不是通用功能列表来权衡标准。
| 提供商 | 访问模式 | Solana 特定考虑因素 |
|---|---|---|
| OnFinality | 共享 RPC API 和专用节点 | Solana HTTP 和 WebSocket 端点,适用于持续或订阅密集型工作负载的专用节点选项 |
| 其他托管 RPC 提供商 | 因计划而异 | 检查共享层级上的方法限制和 WebSocket 限制 |
| 自托管节点 | 完全控制 | 最高的运营开销;你负责升级、监控和故障转移 |
值得向任何提供商提出的问题:
- 每个计划上哪些 Solana RPC 方法可用,是否有任何限制?
- 每个连接和每个账户支持多少并发 WebSocket 订阅?
- 当你超过速率限制时,文档化的行为是什么?
- 是否有你可以查看的状态页面或事件历史?
- 你能否在不改变集成的情况下从共享访问迁移到专用访问?
有关定价和计划结构,请参阅 RPC 定价,有关链的完整列表,请参阅支持的 RPC 网络。
迁移检查点
如果你要从公共端点或其他提供商迁移到专用 Solana 节点,请按顺序进行更改以避免停机。
- 将新端点与旧端点一起添加。 不要立即替换当前端点。
- 将一小部分流量路由到新端点,并比较错误率和延迟。
- 有意地先或后移动订阅。 WebSocket 迁移最具破坏性;单独测试重连逻辑。
- 验证方法一致性。 在转移生产流量之前,确认你调用的每个方法在新端点上都能工作。
- 保持配置了备用端点。 即使有专用节点,也要维护一个辅助端点用于故障转移。
- 监控一个完整周期(至少一周的正常流量),然后再停用旧端点。
如果你的项目也运行在 EVM 链上,同样的迁移纪律适用;专用节点页面描述了 OnFinality 如何构建专用访问。
关键要点
- Solana RPC 性能取决于你的工作负载组合,而不仅仅是原始请求量。昂贵的读取和 WebSocket 订阅通常是真正的约束。
- 共享 RPC API 访问适合低到中等、突发的流量。专用节点访问适合持续高 RPS、大量账户扫描和大型订阅扇出。
- 专用访问提供容量隔离和配置控制,但它不能消除 Solana 网络拥塞或消除对故障转移的需求。
- 在承诺之前用你自己的请求组合进行测试,并验证方法覆盖、WebSocket 限制、承诺处理和速率限制行为。
- 始终保留一个备用端点,并按计划监控端点健康状况。
常见问题解答
小型 dApp 需要专用 Solana 节点吗?
通常不需要。共享 RPC API 端点处理典型的 dApp 读取流量。当你具有持续的高请求量、大量 getProgramAccounts 使用或许多并发 WebSocket 订阅时,考虑专用访问。
专用节点访问会降低 Solana RPC 延迟吗?
它可以在负载下提供更稳定的基线,因为你的流量不会与其他租户竞争,但延迟仍然受 Solana 网络条件和你自己基础设施的影响。用你的工作负载进行测试,而不是假设固定的改进。
我可以在生产中使用公共 OnFinality Solana 端点吗?
公共端点对于测试和低量使用很有用。对于生产工作负载,请查看 RPC 定价并考虑匹配你请求量和订阅需求的计划。
如何处理 Solana 上的 WebSocket 断开连接?
实现自动重连并重新订阅,跟踪每个连接的活动订阅,并避免打开超过你计划支持的订阅。有意测试断开连接行为,而不是等待它在生产中发生。
Solana 主网和 devnet 端点有什么区别?
Devnet 是一个用于开发和测试的独立网络,有自己的端点和状态。使用 Solana Devnet 验证客户端配置,然后转到主网 Solana 网络端点用于生产。
下一步
使用本页顶部的表格对您的 Solana 工作负载进行分类,然后针对您正在考虑的端点模型运行负载测试。如果您的流量是持续的或订阅密集型的,请查看专用节点选项和 RPC 定价以了解适合的方案,并查看 Solana 网络页面获取当前端点详细信息。