摘要
共享 Solana RPC 将许多调用者集中到同一个后端,这保持了低成本且设置简单,但在负载下吞吐量和延迟变得不可预测。专用 Solana 节点为一个工作负载提供其自己的基础设施,因此你可以控制容量、速率限制以及轮询或订阅的积极程度。本文详细分析了权衡、适合每种模型的工作负载,以及如何在承诺之前评估提供商。
Solana 的吞吐量特征很不寻常。区块快速生成,账户不断更新,一个繁忙的 dApp 产生的 RPC 流量可能超过整个中型链。这就是为什么“共享 vs 专用”在 Solana 上比在大多数网络上更重要:同一个端点在安静时段感觉即时,但当吵闹的邻居开始猛击 getProgramAccounts 或打开数千个 WebSocket 订阅时,它可能会停滞。
本页面直接比较两种访问模型,然后帮助你根据工作负载而不是营销文案来选择。如果你已经知道需要隔离的容量,专用节点 是相关选项;如果你仍在权衡提供商,请从 Solana 网络页面 和 RPC 定价 开始。
快速推荐:哪种模型适合你的工作负载
在阅读其余部分之前,将此作为第一层筛选。
- 共享 RPC 通常足够,当 你在进行原型设计、运行具有适度读取流量的钱包、索引一个小程序,或为偶尔出现延迟峰值可容忍的 dApp 提供服务时。
- 专用访问变得值得,当 你运行交易基础设施、高频机器人、具有突发流量的公共 dApp、扫描大量账户集的索引器,或任何依赖稳定 WebSocket 交付的东西时。
- 混合设置在 production 中很常见: 共享端点用于读取密集的 UI 调用,专用节点用于无法承受争用的路径。
如果你还不能描述你的峰值每秒请求数、最大的 getProgramAccounts 调用和 WebSocket 订阅数量,请先测量这些。下面的比较只有在你有粗略数字后才有用。
在 Solana 上,“共享”和“专用”实际意味着什么
共享 RPC 意味着许多客户由负载均衡器后面的同一节点池提供服务。你获得一个 URL、一个速率限制,以及其他租户之后剩下的任何容量。它便宜、设置快速,并且对大多数读取模式来说没问题。权衡是方差:你的延迟和成功率取决于总需求。
专用访问意味着节点(或节点集群)为你的工作负载而配置。你不再竞争共享队列中的槽位,你的速率限制是你租用硬件的函数,而不是共享配额。OnFinality 提供 RPC API 和专用节点基础设施两种模型,因此选择在于将模型与工作负载匹配,而不是可用性。
比较表:共享 vs 专用 Solana RPC
| 维度 | 共享 Solana RPC | 专用 Solana 节点 |
|---|---|---|
| 容量模型 | 跨租户池化 | 为你的工作负载配置 |
| 延迟行为 | 平均良好,峰值时可变 | 在持续负载下更一致 |
| 速率限制 | 按计划固定,共享后端 | 与你的节点规模相关 |
| WebSocket 订阅 | 通常有上限或争用 | 根据你的连接数调整 |
重型方法(getProgramAccounts、getSignaturesForAddress) | 可能被限流或限制 | 主要受你的硬件限制 |
| 归档 / 历史查询 | 取决于提供商保留 | 可通过你的节点配置 |
| 成本概况 | 低,可预测的月度 | 更高,随容量扩展 |
| 运维负担 | 无 | 提供商管理,但你拥有规模决策 |
| 最适合 | 原型、钱包、轻量 dApp | 机器人、索引器、高流量 dApp |
将表格视为决策辅助,而非保证。实际数字取决于提供商、区域和你的请求组合。
改变决策的 Solana 特定压力点
Solana 的 RPC 表面与 EVM 链不同,这使得共享访问对某些工作负载风险更大。
账户扫描成本高昂。 getProgramAccounts 可能返回巨大的结果集。在共享端点上,提供商经常限流或禁用它,因为一个调用者可能降低池的性能。在专用节点上,成本落在你自己的容量上。
WebSocket 订阅是有状态的。 accountSubscribe、logsSubscribe 和 slotSubscribe 持有服务器端状态。共享池必须限制并发订阅,因此当其他租户活跃时,你的有效上限可能会下降。
槽级时序很重要。 对槽变化或新区块做出反应的机器人需要一致的交付,而不仅仅是一致平均延迟。争用表现为抖动,这比稍微更高的基线更难处理。
承诺级别与负载相互作用。 对 processed 或 confirmed 数据的请求比可能需要更深状态的 finalized 查询更便宜。在争用下,差距会扩大。
在承诺之前如何基准测试
不要从规格表中选择模型。对共享端点和专用节点运行相同的探测,并比较分布,而不仅仅是均值。
# Measure latency distribution for a common read call
for i in $(seq 1 50); do
curl -s -o /dev/null -w "%{time_total}\n" \
-X POST https://solana.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot","params":[]}'
done
对于更真实的测试,重放你自己的流量组合。一个在循环中调用 getLatestBlockhash 和 sendTransaction 的机器人对节点的压力不同于跨多个地址运行 getSignaturesForAddress 的索引器。捕获 p50、p95 和 p99 延迟,以及按方法划分的错误率。
如果你使用 WebSocket,请单独测试订阅稳定性:
// Minimal WebSocket subscription probe
const ws = new WebSocket("wss://solana.api.onfinality.io/public-ws");
let count = 0;
ws.onopen = () => {
ws.send(JSON.stringify({
jsonrpc: "2.0", id: 1,
method: "slotSubscribe",
params: []
}));
};
ws.onmessage = () => {
count++;
if (count % 100 === 0) console.log(`slots received: ${count}`);
};
ws.onclose = () => console.log("closed after", count, "slots");
在高峰时段运行一个小时。在负载下断开套接字的共享端点将在这里显示出来。
Solana 提供商评估矩阵
当你比较提供商时,重要的问题是运营性的,而不是表面性的。OnFinality 在这里首先出现,因为它是本比较的参考点,但标准适用于你评估的任何提供商。
| 提供商 | 访问模型 | 需要验证的内容 |
|---|---|---|
| OnFinality | 共享 RPC API 和专用节点 | 方法支持、WebSocket 限制、专用规模选项、区域放置 |
| 其他托管 RPC 提供商 | 通常共享,有时专用 | 是否允许重型方法、订阅上限、历史查询保留 |
| 自托管节点 | 按定义专用 | 硬件成本、验证者/RPC 调优、升级节奏、待命负担 |
向每个提供商提出相同的问题:哪些方法被限流、WebSocket 上限是多少、历史数据如何保留,以及网络拥塞期间会发生什么。模糊的答案是信号。
成本和风险权衡
共享 RPC 在绝对意义上更便宜,几乎没有运营开销。隐藏成本是围绕速率限制、重试和抖动进行工程的时间。如果你的团队花费一个冲刺构建退避逻辑以在共享端点上生存,节省可能已经消失。
专用节点每月成本更高,但将约束从“别人的配额”转移到“你的硬件规模”。对于生产系统来说,这是一个更可预测的位置,因为你可以有意识地扩展,而不是协商限制。
自托管是第三种选择。它提供最大控制,但增加了硬件采购、监控、升级和事件响应。对于大多数团队来说,托管专用节点捕获了大部分好处,而没有待命负载。
迁移检查点:从共享迁移到专用
如果你决定迁移,请分阶段进行,而不是在一次部署中切换。
- 清点你的方法。 列出你的应用进行的每个 RPC 调用,并标记昂贵的方法。
- 搭建专用节点 并将暂存环境指向它。
- 重放生产流量 到新端点,并比较错误率和延迟百分位数。
- 先转移读取流量,然后移动交易提交和 WebSocket 订阅。
- 在客户端配置中保留共享端点作为回退,这样单个节点问题不会导致应用宕机。
客户端中一个简单的故障转移模式如下所示:
const endpoints = [
"https://your-dedicated-solana-endpoint",
"https://solana.api.onfinality.io/public"
];
async function callRpc(body) {
for (const url of endpoints) {
try {
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body)
});
if (res.ok) return res.json();
} catch (e) {
// try next endpoint
}
}
throw new Error("all RPC endpoints failed");
}
关键要点
- 共享 Solana RPC 是原型、钱包和轻量 dApp 的良好默认选择,但容量是池化的,在负载下可能变化。
- 专用节点适合机器人、索引器、高流量 dApp,以及任何依赖稳定 WebSocket 交付的东西。
- Solana 特定的方法如
getProgramAccounts和有状态订阅是团队超出共享访问的最常见原因。 - 用你自己的流量组合进行基准测试,并比较 p95/p99 延迟和错误率,而不仅仅是平均响应时间。
- 带有共享回退的混合设置是一种实用的生产模式。
- 在承诺模型之前,查看 RPC 定价 和 支持的网络。
常见问题
我可以从共享 RPC 开始,以后迁移到专用吗? 是的。大多数团队正是这样做的。将你的 RPC 调用放在一个小抽象层后面,这样切换端点就是配置更改,而不是重构。
专用节点会移除所有速率限制吗? 不会。限制仍然存在,但它们与你配置的容量相关,而不是共享配额。你可以根据工作负载调整节点大小。
WebSocket 订阅在专用节点上更好吗? 它们通常更稳定,因为订阅状态不与其他租户竞争。在高峰时段用你自己的订阅数量进行测试。
自托管比专用节点便宜吗? 有时在纸面上是,但一旦考虑硬件、监控、升级和事件响应,实践中很少。比较总成本,而不仅仅是月度账单。
我如何知道我的应用实际需要哪些方法? 记录你的 RPC 调用一周。列表通常比预期的短,它告诉你确切需要协商哪些限制。
下一步
如果你仍在决定,请从 Solana 网络页面 开始,确认端点和传输细节,然后查看 RPC 定价 了解共享和专用选项。如果你的工作负载已经有明确的峰值数字,专用节点 是获得隔离容量的最快路径。对于适用于跨链的更广泛框架,请参阅 如何选择 RPC 提供商。