摘要
共享 Solana RPC 池将许多应用路由到同一节点集群,这使入门简单且成本低廉,但你的吞吐量和延迟会受到其他租户流量的影响。专用节点访问为你的工作负载提供独立的节点容量,因此你可以控制速率限制、WebSocket 订阅以及归档或跟踪密集型调用,而无需竞争槽位。
正确的选择取决于你的工作负载形态:原型、钱包和低流量读取通常可以在共享端点上正常运行,而交易机器人、索引器和高频 dApp 通常需要专用容量或带有故障转移的混合设置。本文分析了权衡取舍、重要的 Solana 特定约束,以及如何评估 OnFinality 等提供商在任一模型下的表现。
快速推荐
如果你还在验证一个想法,共享 Solana RPC 端点通常就足够了:你获得一个可用的 URL、标准 JSON-RPC 方法,并且无需运行基础设施。当以下任一情况成立时,请转向专用节点访问:
- 你的应用发送大量
getProgramAccounts、getSignaturesForAddress或getTransaction调用,与其他租户竞争。 - 你依赖 WebSocket 订阅(
accountSubscribe、logsSubscribe、slotSubscribe)并需要稳定的连接数。 - 你需要归档深度的历史记录、跟踪式调试,或为交易机器人或索引器提供可预测的吞吐量。
- 你希望与嘈杂邻居流量隔离,以便一个重度调用者不会影响你的延迟。
一种常见模式是混合:共享端点用于只读仪表板和回退,专用容量用于延迟敏感路径。OnFinality 同时提供 RPC API 访问 和 专用节点,因此你可以从共享开始,然后升级到专用,而无需更改应用程序代码。
在 Solana 上,“共享”和“专用”实际意味着什么
在 Solana 上,RPC 节点不仅仅是数据库前面的代理。它维护账本视图,提供账户和交易查询,并可以将交易转发到验证器网络。节点的分配方式是区分两种模型的关键。
共享节点访问意味着你的请求落在许多客户使用的节点池上。提供商平衡负载,应用全局或按密钥的速率限制,并可能缓存或路由请求。你获得一个公共或 API 密钥端点,例如:
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot","params":[]}'
专用节点访问意味着一个节点(或一个小集群)保留给你的工作负载。你仍然通过 HTTP 或 WebSocket 连接,但容量、速率限制,以及通常节点版本和配置都由你控制。专用访问通常与私有端点配对,并且根据提供商的不同,还有专用的 WebSocket URL。
两种模型都不会改变 JSON-RPC 接口。这是有意为之:你应该能够通过更改 URL 来切换,而不是重写客户端。
共享访问的瓶颈
共享端点并不“坏”——它们适合特定的工作负载形态。当你的请求模式昂贵或突发时,它们开始带来问题。
| 症状 | 通常发生了什么 | 下一步做什么 |
|---|---|---|
| 高峰时段出现 429 响应 | 与其他租户共享的全局或按密钥速率限制 | 添加退避,然后评估专用容量 |
| 负载下 WebSocket 断开连接 | 共享池上的连接限制 | 将订阅移至专用端点 |
getProgramAccounts 扫描缓慢 | 重度扫描竞争节点 CPU 和内存 | 使用过滤查询,或在专用节点上运行扫描 |
| 市场开盘时延迟不一致 | 共享节点上的嘈杂邻居流量 | 在专用节点上隔离交易路径 |
| 缺少旧交易 | 节点未启用归档或被修剪 | 请求归档访问或专用归档节点 |
如果其中两个或更多适用于你的生产路径,那么共享访问在重试和失败用户操作上造成的成本可能比专用容量的直接成本更高。
改变决策的 Solana 特定约束
Solana 的账户模型和高槽率使某些 RPC 模式比在 EVM 链上更昂贵。这些是最常迫使转向专用节点的情况。
- 账户扫描很重。 对大型程序执行
getProgramAccounts可能返回巨大的结果集。过滤器(dataSlice、memcmp、dataSize)减少负载,但查询仍然消耗节点资源。 - WebSocket 订阅是有状态的。 每个订阅持有服务器端状态。共享池限制并发订阅;专用节点让你根据应用调整该限制。
- 槽和区块历史增长迅速。 深度历史查询可能需要归档节点而不是标准节点。
- 交易转发很重要。 对于交易和支付,从你的 RPC 到验证器网络的路径影响确认行为。专用节点为你提供更可预测的路径。
决策指南:将工作负载匹配到访问模型
在与任何提供商交谈之前,使用此表将你的工作负载映射到正确的模型。
| 工作负载 | 共享通常足够 | 专用通常更好 | 备注 |
|---|---|---|---|
| 钱包余额和代币读取 | 是 | 可选 | 低流量,可缓存 |
| NFT 铸造或领取页面 | 是,带重试 | 用于发布高峰 | 突发短但尖锐 |
| 交易机器人 / 做市商 | 否 | 是 | 延迟和 WebSocket 稳定性很重要 |
| 索引器或分析管道 | 否 | 是 | 高读取量,归档深度 |
| 面向用户的 RPC 的 dApp | 是 | 混合 | 专用主用,共享回退 |
| Devnet / testnet 工作 | 是 | 很少 | 使用 Solana Devnet |
一个有用的规则:如果失败的 RPC 调用导致用户可见错误或错过交易,那么该调用属于专用容量。
如何评估 Solana RPC 提供商
一旦你知道需要哪种模型,就根据实际影响生产的事项比较提供商。
- 传输支持。 确认 HTTP 和 WebSocket 可用性。OnFinality 的 Solana 网络页面 列出了支持的传输和端点。
- 速率限制和突发行为。 询问限制如何执行,以及专用计划是否消除共享池争用。
- 归档和历史深度。 如果你查询旧交易,确认归档支持而不是假设它。
- 方法覆盖。 检查你依赖的方法——包括订阅方法——在你购买的套餐上是否受支持。
- 故障转移选项。 询问是否可以添加第二个端点或区域以实现冗余。
- 可观测性。 寻找可以在你自己的监控中使用的请求指标、错误率和日志。
- 定价模型。 将基于请求和基于容量的定价与你的实际流量进行比较。有关 OnFinality 如何构建计划,请参阅 RPC 定价。
如果你更广泛地比较提供商,RPC 提供商选择指南 涵盖了通用标准;本文重点介绍 Solana 访问模型决策。
为任一模型配置客户端
因为两种模型都使用 JSON-RPC,切换是配置更改。将端点保留在环境变量中,这样你可以在共享和专用之间移动而无需代码部署。
// Solana Web3.js 示例:通过环境变量交换端点
import { Connection } from "@solana/web3.js";
const endpoint = process.env.SOLANA_RPC_URL; // 共享或专用 URL
const wsEndpoint = process.env.SOLANA_WS_URL; // 专用 WebSocket URL
const connection = new Connection(endpoint, {
commitment: "confirmed",
wsEndpoint,
});
const slot = await connection.getSlot();
console.log("current slot", slot);
对于 WebSocket 订阅,当你离开共享访问时,将 wsEndpoint 指向专用 WebSocket URL,并添加带指数退避的重连逻辑。订阅在套接字断开后不会存活,因此重连时重新订阅。
// 账户更改的重新订阅模式
function subscribeToAccount(connection, publicKey) {
let subId;
const start = () => {
subId = connection.onAccountChange(publicKey, (info) => {
console.log("account changed", info.lamports);
}, "confirmed");
};
start();
connection._rpcWebSocket.on("close", () => {
setTimeout(start, 1000);
});
}
迁移检查点
从共享访问转向专用访问主要是操作性的,而不是架构性的。按顺序完成这些检查点。
- 基线化你的流量。 记录至少一周的请求计数、方法组合、错误率和峰值并发。
- 识别关键路径。 将延迟敏感的调用与后台读取分开。
- 配置专用容量。 仅从关键路径开始;其余保留在共享端点上。
- 双运行。 将一定百分比的流量发送到专用端点,并比较错误率和延迟。
- 添加故障转移。 配置辅助端点,并通过故意使主端点失败来测试它。
- 切换。 完全移动关键路径,保留共享作为回退,并监控完整的流量周期。
- 审查限制。 根据新的基线重新检查速率限制和订阅上限。
即使在切换后,也要在配置中保留共享端点。它是一个廉价的回退,对非关键任务有用。
常见陷阱
- 假设共享端点没有限制。 它们有限制,而且限制与其他租户共享。
- 将 WebSocket 视为即发即忘。 无论哪种模型,订阅都需要重连和重新订阅逻辑。
- 在面向用户的端点上运行重度扫描。 将
getProgramAccounts扫描移至单独的端点或批处理作业。 - 跳过归档检查。 在构建依赖旧交易的功能之前,确认历史深度。
- 忘记 devnet。 在接触主网之前,在 Solana Devnet 上测试配置更改。
关键要点
- 共享 Solana RPC 非常适合低流量读取、原型和回退路径。
- 当延迟、WebSocket 稳定性、归档深度或突发容量影响用户可见结果时,专用节点访问是正确的选择。
- 两种模型中的 JSON-RPC 接口相同,因此迁移主要是配置和操作。
- Solana 特定模式——账户扫描、有状态订阅、快速增长的的历史——是决策的主要驱动因素。
- 具有专用主用和共享回退的混合设置是生产应用的实用默认值。
- OnFinality 同时提供 RPC API 访问 和 专用节点,Solana 端点列在 Solana 网络页面 上。
常见问题
专用节点访问总是比共享更快吗? 不一定。专用访问消除了其他租户的争用,这通常使延迟更一致,但你自己的查询模式仍然决定性能。在迁移前后都要测量。
我可以在共享和专用端点上使用相同的代码吗? 可以。两者都使用标准 Solana JSON-RPC over HTTP,WebSocket 订阅使用相同的方法。将端点保留在环境变量中,这样你可以在不更改代码的情况下切换。
WebSocket 订阅需要专用节点吗? 不总是,但共享池通常限制并发订阅。如果你的应用持有许多长期订阅,专用访问为你提供可预测的容量。
归档数据呢? 归档深度取决于节点配置,而不是访问模型。在构建查询旧交易的功能之前,与你的提供商确认归档支持。
在哪里可以看到 OnFinality 支持哪些 Solana 端点? Solana 网络页面 列出了支持的传输和端点,RPC 定价 涵盖了计划选项。你也可以浏览 支持的 RPC 网络 以了解其他链。