摘要
Solana dApp 对 RPC 基础设施施加了不寻常的压力:高请求量、频繁的账户和程序读取、WebSocket 订阅,以及围绕交易和市场事件的突发流量。提供商选择应由工作负载形态驱动,而不是由单个头条数字决定。最重要的标准是方法覆盖、WebSocket 和订阅支持、归档和历史数据访问、速率限制和突发行为、故障转移设计,以及提供商如何透明地处理 Solana 特有的故障模式,例如过时的 slot 读取和丢失的订阅。
本文为您提供了一个针对 Solana dApp RPC 的实用评估矩阵、一种在提交之前快速测试端点的方法,以及一份当流量增长时从共享公共端点迁移到托管 RPC API 或专用节点的清单。OnFinality 提供 Solana RPC API 访问和专用节点选项,您可以在选择计划之前查看支持的网络和 RPC 定价页面上的覆盖范围。
Solana dApp 的行为不像典型的 EVM 前端。一个屏幕可以读取数十个账户、订阅程序日志、轮询 slot 变化,并提交必须快速落地的交易。这种流量形态改变了您应该评估 RPC 提供商的方式。与其问哪个提供商“最好”,不如问哪个提供商适合您的请求组合、订阅需求以及对拥塞期间读取降级的容忍度。
本页面为您提供了一个选择框架,您可以在注册任何服务之前应用,以及一个可以对任何端点运行的简短测试。
从您的工作负载开始,而不是提供商列表
在比较提供商之前,写下您的 dApp 实际做了什么。Solana RPC 选择出错最常见的情况是团队根据与他们的流量不匹配的通用基准来选择提供商。
首先回答这些问题:
- 读密集型还是写密集型? 钱包或投资组合视图是读密集型的。交易机器人或游戏循环是写密集型且对延迟敏感的。
- 您需要订阅吗? 如果您使用
accountSubscribe、logsSubscribe、programSubscribe或slotSubscribe,WebSocket 支持是强制性的,而不是可选的。 - 您需要历史状态吗? 回填、分析和索引器通常需要归档数据,而不仅仅是最新的 slot。
- 您的突发模式是什么? 稳定流量和事件驱动的峰值需要不同的容量规划。
- 如果端点降级会发生什么? 如果缓慢的读取会破坏您的 UI,您需要故障转移和健康检查,而不仅仅是一个 URL。
一旦您能用这些术语描述您的工作负载,提供商比较就会变得具体得多。
Solana dApp 的提供商评估矩阵
使用此矩阵根据实际影响 Solana dApp 的标准来比较候选者。列名故意与 Solana 行为相关联,而不是通用基础设施语言。
| 评估领域 | 需要验证的内容 | 为什么对 Solana dApp 重要 |
|---|---|---|
| 方法覆盖 | 支持您调用的 JSON-RPC 方法,包括 getProgramAccounts、getTokenAccountsByOwner、simulateTransaction 和 sendTransaction | 缺失或受限的方法会迫使使用变通方法并增加额外的往返 |
| 订阅支持 | 用于账户、日志、程序和 slot 订阅的 WebSocket 端点 | 实时 UI 和机器人依赖推送更新,而不是轮询 |
| 归档和历史读取 | 查询较旧 slot 和历史账户状态的能力 | 回填、分析和核对需要超出尖端的数据 |
| 速率限制和突发处理 | 公布的限额、突发行为以及如何发出节流信号 | Solana 流量是尖峰的;不明确的限制会导致静默失败 |
| 故障转移和冗余 | 多个端点、健康检查和文档化的故障转移行为 | 单个端点就是单点故障 |
| 可观测性 | 请求指标、错误可见性和支持渠道 | 您无法调试您看不到的东西 |
| 承诺和一致性 | 提供商如何处理承诺级别和 slot 滞后 | 过时的读取会导致令人困惑的 UI 和逻辑错误 |
| 商业契合度 | 计划限制、超额行为和升级路径 | 防止使用量增长时出现意外成本 |
OnFinality 在这里首先出现,因为它是本网站运营的提供商:它通过 HTTP 和 WebSocket 提供 Solana RPC API 访问,并为需要隔离容量的团队提供专用节点选项。您可以在 Solana RPC 网络页面 上确认当前网络覆盖范围,并在 RPC 定价 上查看计划形态。
在提交之前测试端点
您不需要长时间的评估来发现大多数问题。对任何候选端点进行简短探测就能告诉您基本读取、订阅和错误处理是否按预期运行。
从通过 HTTP 进行简单的健康和 slot 检查开始:
curl -s https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}'
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":"confirmed"}]}'
然后检查您的 dApp 实际依赖的方法。例如,程序账户读取:
curl -s https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getProgramAccounts","params":["<PROGRAM_ID>",{"encoding":"base64","commitment":"confirmed"}]}'
最后,测试一个 WebSocket 订阅,因为这是许多提供商差异所在。一个最小的 JavaScript 检查如下所示:
const ws = new WebSocket("wss://solana.api.onfinality.io/public-ws");
ws.onopen = () => {
ws.send(JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "slotSubscribe"
}));
};
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
if (msg.method === "slotNotification") {
console.log("slot", msg.params.result.slot);
}
};
ws.onerror = (err) => console.error("ws error", err);
对每个候选者运行这些,并注意它们是否工作,以及它们如何失败。超时、不明确的错误代码和丢失的订阅都是选择信号。
需要注意的 Solana 特有故障模式
通用的 RPC 建议通常会忽略 Solana 独有的故障模式。当您评估提供商时,询问它如何处理这些:
- Slot 滞后和过时读取。 如果端点落后于网络尖端,您的 UI 可能会显示过时的余额。对照已知良好的源检查
getSlot并注意漂移。 - 订阅丢失。 WebSocket 连接可能会静默断开。确认提供商是否记录了重连行为,以及您的客户端是否需要心跳逻辑。
getProgramAccounts成本。 此方法可能很昂贵,有时会受到限制。在围绕它进行设计之前,确认支持情况和任何过滤要求。- 交易落地。 拥塞下的
sendTransaction行为各不相同。询问提供商如何转发交易以及是否提供任何重试指导。 - 承诺语义。 确保您的客户端和提供商在
processed、confirmed和finalized处理上达成一致,因为混合它们会导致微妙的错误。
如果您仍在决定是使用共享端点还是隔离容量,权衡在 如何选择 RPC 提供商 中有所介绍。
共享端点、托管 RPC API 还是专用节点?
大多数 Solana dApp 经历三个阶段。识别您的阶段可以防止您过度或不足地购买基础设施。
| 阶段 | 典型信号 | 合理选择 |
|---|---|---|
| 原型 | 本地测试、低流量、没有真实用户 | 公共或 Devnet 端点 |
| 早期生产 | 真实用户、稳定读取、一些订阅 | 具有明确限制的托管 RPC API |
| 扩展生产 | 高请求量、延迟敏感、严格的隔离需求 | 专用节点或私有端点 |
对于开发和测试,Solana Devnet RPC 端点将实验与主网流量分开。对于生产,托管 RPC API 服务 为您提供了一个受支持的端点,而无需自己运营验证器。当您的工作负载超出共享容量时,专用节点 提供隔离的资源和更可预测的行为。
升级阶段的正确时机通常是当您开始编写自定义重试逻辑来绕过共享端点时,或者当单个降级的端点可能导致面向用户的功能瘫痪时。
上线前的操作清单
选择并不止于注册。这些检查可以防止大多数生产事故:
- 配置至少两个端点。 使用一个主端点和一个备用端点,并相应地路由读取。
- 添加健康检查。 轮询
getHealth和getSlot,并在失败或 slot 漂移时发出警报。 - 处理订阅重连。 假设 WebSocket 会断开,并以退避方式重连。
- 记录带有上下文的 RPC 错误。 捕获方法、参数和响应,以便重现问题。
- 有意设置承诺级别。 不要让默认值为您决定一致性。
- 根据您的峰值审查限制。 为突发做计划,而不是平均值。
- 保持升级路径开放。 在需要之前了解如何迁移到专用容量。
一个简单的监控探测可以与您的应用程序健康检查一起安排:
async function probe(url) {
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "getSlot" })
});
const data = await res.json();
return { ok: res.ok, slot: data?.result };
}
在没有可信基准的情况下比较提供商
公共基准对于定位很有用,但很少与您的流量匹配。与其追求单一的延迟数字,不如根据与您的 dApp 相关的标准来比较提供商:方法覆盖、订阅可靠性、归档访问、限制透明度、故障转移和支持响应能力。
比较时,保持比较事实性。向每个提供商提出相同的问题,测试相同的方法,并记录它们在负载下的行为。一个对限制和故障行为透明的提供商通常比一个在没有上下文的情况下宣传最低数字的提供商更容易运营。
OnFinality 的 Solana 支持、传输选项和端点详细信息记录在 Solana RPC 网络页面 上,更广泛的覆盖范围列在 支持的 RPC 网络 下。
关键要点
- Solana dApp RPC 选择应从您的工作负载开始:读/写组合、订阅需求、归档要求和突发模式。
- 方法覆盖、WebSocket 订阅、归档访问、速率限制透明度和故障转移是影响 Solana dApp 最大的标准。
- 在提交之前,使用真实方法测试候选端点,包括
getProgramAccounts和 WebSocket 订阅。 - 注意 Solana 特有的故障模式,例如 slot 滞后、丢失的订阅和承诺不匹配。
- 随着流量和可靠性需求的增长,从公共端点迁移到托管 RPC API,然后迁移到专用节点。
- 始终配置故障转移和健康检查,而不是依赖单个端点。
常见问题
对于 Solana dApp RPC 提供商,最重要的标准是什么?
这取决于您的工作负载,但方法覆盖和订阅支持通常是第一道过滤器。如果您的 dApp 依赖 WebSocket 或 getProgramAccounts,在比较其他任何内容之前,请确认这些工作正常。
我需要专用的 Solana 节点吗? 开始时不需要。托管 RPC API 通常足以满足早期生产需求。当您需要隔离容量、在负载下更可预测的行为或与共享流量更严格的分离时,考虑专用节点。
如何测试 Solana RPC 端点?
通过 HTTP 运行几个 JSON-RPC 调用(getHealth、getSlot 以及您的 dApp 使用的一个方法),然后打开一个 WebSocket 订阅并确认您收到更新。注意端点在失败时的行为,而不仅仅是成功时。
是什么导致 Solana dApp 中的数据过时? Slot 滞后和承诺不匹配是常见原因。如果您的端点落后于网络尖端,或者您的客户端和提供商使用不同的承诺级别,读取可能会显得过时。
我可以在生产中使用公共 Solana 端点吗? 公共端点适用于原型设计和测试。对于有真实用户的生产流量,托管 RPC API 或专用节点为您提供更清晰的限制、支持和故障转移选项。有关计划形态,请参阅 RPC 定价。
一个 dApp 应该使用多少个 RPC 端点? 至少两个:一个主端点和一个备用端点。这使您可以在一个端点降级时进行故障转移,并为您提供在事件期间比较行为的方法。