摘要
可以。Solana RPC 提供商的主要区别在于它们如何计量请求(按秒 vs 按方法 vs 按计算单元)、允许的突发余量,以及当共享限制成为障碍时,你是否可以迁移到专用节点。本文详细介绍了你会遇到的限流模型,并为你提供了一种在做出承诺之前进行比较的实用方法。
你将获得一个比较表格、常见 Solana JSON-RPC 调用的方法成本映射、用于测量真实余量的监控代码片段,以及关于何时专用 Solana 节点比共享端点更合适的指导。
如何在不猜测的情况下比较 Solana RPC 速率限制
大多数 Solana RPC 比较止步于“每秒请求数”。这个数字是真实的,但它掩盖了真正会破坏生产应用的部分:哪些方法被计量、是否允许突发、WebSocket 订阅如何计数,以及当你越线时会发生什么。在选择提供商之前,先确定以下三种配置中哪一种与你的工作负载匹配。
- 轻量交互式应用(钱包、仪表盘、几百个用户):带有每秒请求上限的共享端点通常就足够了。优化可预测的成本和简单的故障转移。
- 索引器或分析任务(回填、
getSignaturesForAddress、getProgramAccounts):方法级或计算单元计量比原始 RPS 更重要,因为重型调用会消耗不成比例的容量。 - 交易或实时服务(WebSocket 订阅、紧密确认循环):你需要了解订阅如何计费,以及是否可以获得专用节点来消除共享池争用。
如果你能说出你的配置,剩下的比较就是机械性的。如果不能,请从测量你当前的请求组合开始——下面的监控部分展示了如何操作。
你实际会遇到的限流模型
Solana RPC 提供商通常以四种方式之一计量流量,许多提供商结合两种。
- 每秒请求上限(RPS)。 每秒请求数的固定上限,有时带有短暂的突发允许量。简单,但一个昂贵的调用可能消耗与廉价调用相同的“槽位”。
- 按方法限制。 特定方法(通常是
getProgramAccounts、getSignaturesForAddress、getTransaction)有自己的较低上限,因为它们的服务成本高昂。 - 计算单元或信用计量。 每个方法被分配一个成本权重;你的计划每秒或每月授予一个预算。这是混合工作负载最公平的模型,但如果没有工具,最难预测。
- 连接和订阅限制。 对并发 WebSocket 连接、每个连接的订阅数或两者的上限。很容易被忽视,直到你的实时数据流无声地中断。
一个宣传高 RPS 数字但应用严格按方法限制的提供商,可能感觉比一个标称速率较低但方法预算慷慨的提供商更慢。始终要求方法级细分,而不仅仅是顶线数字。
提供商评估矩阵
当你与任何 Solana RPC 提供商(包括 OnFinality)交谈时,使用此表作为检查清单。右侧列是拿到答案后该做什么。
| 比较内容 | 要问的问题 | 为什么它会改变你的决定 |
|---|---|---|
| 计量模型 | RPS、按方法还是计算单元? | 决定你的重型调用还是调用量是瓶颈 |
| 突发余量 | 在稳态上限之上是否有短暂的突发? | 平滑流量峰值,而无需立即升级计划 |
| 昂贵方法策略 | getProgramAccounts 和 getSignaturesForAddress 是否单独设限? | 这些调用主导索引器成本,是限流的常见来源 |
| WebSocket 计费 | 订阅是否与 HTTP 计入同一预算? | 实时应用可能仅通过订阅就耗尽计划 |
| 专用选项 | 你能迁移到专用 Solana 节点吗? | 当共享限制成为约束时,消除共享池争用 |
| 故障转移 | 你能运行第二个端点并在出错时切换吗? | 防止提供商侧事件和计划上限 |
| 可观测性 | 你能获得按方法的使用情况和错误细分吗? | 让你合理调整计划规模,而不是过度购买 |
OnFinality 通过其 Solana 网络页面 提供共享 Solana RPC,并通过 专用节点基础设施 提供专用 Solana 节点,当共享限制不再适合时。使用上述相同行与其他提供商进行比较,以便决策是同类比较。
每个 Solana 方法的成本
并非每个 JSON-RPC 调用都是平等的。下表按常见 Solana 方法对共享端点施加的压力进行分组。将其视为规划指南,而非固定价格表——确切权重因提供商而异。
| 方法 | 典型权重 | 限流规划注意事项 |
|---|---|---|
getLatestBlockhash | 低 | 频繁但廉价;在确认循环中安全 |
getBalance、getAccountInfo | 低 | 适合中等量的交互式应用 |
sendTransaction | 中 | 注意重试风暴;在重发前去重 |
getTransaction、getSignatureStatuses | 中 | 在紧密循环中轮询这些会迅速累积 |
getSignaturesForAddress | 高 | 仔细分页;回填可能消耗整个预算 |
getProgramAccounts | 非常高 | 限流的经典原因;积极缓存和过滤 |
WebSocket accountSubscribe / logsSubscribe | 不定 | 根据提供商按订阅或按消息计数 |
实际结论:如果你的工作负载由底部三行主导,带有按方法上限的共享端点将在你的 RPS 上限之前很久就限制你。这是评估专用节点的最明确信号。
在切换之前测量你的真实余量
不要根据营销数字比较提供商。先测量你自己的流量,然后进行比较。一个记录延迟和错误代码的小型探针会告诉你实际所处的位置。
// 最小 Solana RPC 探针:延迟 + 错误采样
const ENDPOINT = "https://solana.api.onfinality.io/public";
async function probe(method, params = []) {
const start = Date.now();
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
});
const body = await res.json();
return {
method,
status: res.status,
ms: Date.now() - start,
error: body.error?.code ?? null,
};
}
(async () => {
const calls = [
["getLatestBlockhash", []],
["getBalance", ["11111111111111111111111111111111"]],
];
for (const [m, p] of calls) console.log(await probe(m, p));
})();
在相同条件下,针对你当前的端点和候选端点运行此代码。跟踪三个信号:中位延迟、HTTP 429 响应率以及 JSON-RPC 错误代码,如 -32005(节点落后或受限)。在稳定流量下 429 率上升是你接近上限的最早迹象。
如需快速手动检查,单个 curl 调用可确认连接性和响应格式:
curl -s https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}'
健康的端点返回 {"jsonrpc":"2.0","result":"ok","id":1}。如果你在这里看到错误,问题在于连接性或端点本身,而不是你的速率限制。
WebSocket 订阅及其隐藏预算
实时 Solana 应用依赖 WebSocket 订阅,这是限流比较最常出错的地方。两个提供商可以宣传相同的 HTTP RPS,但对订阅的处理完全不同。
- 有些将每个订阅计入你的请求预算;有些则计算每条传递的消息。
- 有些限制并发连接;有些限制每个连接的订阅数。
- 重连行为很重要:如果提供商积极断开空闲连接,你的客户端可能会不断重新订阅并消耗预算。
当你评估提供商时,具体询问 accountSubscribe、logsSubscribe 和 slotSubscribe 如何计量,以及 WebSocket 端点是否与 HTTP 共享预算。OnFinality 为 Solana 公开了 HTTP 和 WebSocket 传输;确切的端点列在 Solana 网络页面 上。
当共享端点不再足够时
有一个点,调整客户端不再有帮助,共享池本身成为约束。注意这些信号:
- 429 响应出现在你的正常流量水平,而不仅仅是峰值期间。
getProgramAccounts或回填任务持续失败或超时。- WebSocket 订阅在负载下断开,重新订阅循环开始。
- 你的提供商的按方法上限低于你对一两个方法的稳态需求。
此时,比较从“哪个共享计划”转向“共享 vs 专用”。专用 Solana 节点为你的工作负载提供自己的容量,而不是共享池,从而消除来自其他租户的争用。它不一定更便宜,因此要权衡它与围绕共享限制进行工程设计的成本。查看 RPC 定价 了解计划形态,查看 专用节点基础设施 了解专用选项。
切换 Solana RPC 提供商的迁移清单
如果你决定迁移,请以受控方式进行,而不是硬切换。
- 清点你的方法。 列出你的应用使用的每个 JSON-RPC 方法和订阅,以及大致调用量。
- 将调用量映射到新的计量模型。 将你的组合转换为候选提供商的单位(RPS、方法上限或信用),以便进行同类比较。
- 并行运行两个端点。 将一定比例的读流量发送到新端点,并比较延迟和错误率。
- 添加故障转移。 配置辅助端点,并在 429 或连接错误时切换,而不是让请求失败。
- 重新测试重型任务。 在依赖新端点之前,针对它运行
getProgramAccounts或回填任务。 - 最后切换写入。 仅在读取稳定后移动
sendTransaction流量,并暂时保留旧端点作为回退。
保持并行运行窗口足够长,以覆盖完整的流量周期,包括你最繁忙的时间。
关键要点
- Solana RPC 限流很少只是 RPS;按方法上限、计算单元计量和订阅限制通常决定你能运行什么。
- 像
getProgramAccounts和getSignaturesForAddress这样的昂贵方法是最常见的限流原因,而不是原始调用量。 - 在根据标题数字比较提供商之前,先测量你自己的延迟、429 率和 JSON-RPC 错误代码。
- 询问 WebSocket 订阅如何计量,因为实时应用可能仅通过订阅就耗尽计划。
- 当共享限制成为约束时,专用 Solana 节点消除共享池争用;将其与围绕限制进行工程设计的成本进行比较。
- OnFinality 提供共享 Solana RPC 和专用 Solana 节点;从 Solana 网络页面、RPC 定价 和 支持的 RPC 网络 的完整列表开始。
常见问题解答
所有 Solana RPC 提供商都使用相同的限流模型吗? 不。有些使用固定的每秒请求上限,有些应用按方法限制,有些使用计算单元或信用计量。许多结合两种或更多。模型比标题数字更重要,因为它决定你的哪些调用首先被限流。
为什么我的应用在请求率很低的情况下仍然达到限制?
通常是因为少数昂贵方法主导了你的使用。像 getProgramAccounts 和 getSignaturesForAddress 这样的调用消耗的容量远超其请求计数所暗示的,因此总体速率低仍可能触发按方法上限。
WebSocket 订阅是否与 HTTP 调用计入同一限制? 这取决于提供商。有些将订阅或传递的消息计入你的预算,有些则限制并发连接。在承诺之前询问,尤其是对于实时应用。
我什么时候应该从共享 Solana 端点迁移到专用节点? 当 429 在正常流量水平出现、重型方法持续失败或 WebSocket 订阅在负载下断开时。此时共享池是约束,专用节点为你的工作负载提供自己的容量。
在切换之前如何测试新的 Solana RPC 提供商? 并行运行两个端点,将一部分读流量发送到新端点,并比较延迟、429 率和 JSON-RPC 错误代码。重新测试你最重的任务,然后最后移动写入流量,并设置故障转移。
我可以使用 OnFinality 进行 Solana RPC 吗? 可以。OnFinality 提供共享 Solana RPC 和专用 Solana 节点。查看 Solana 网络页面 获取端点,查看 RPC 定价 了解计划详情。