摘要
比较 Solana RPC 提供商的速率限制结构、突发允许量和 WebSocket 并发数。了解在免费层、付费计划和专用节点中应检查什么,以及如何将限制与您的应用流量模式相匹配。
快速建议:将速率限制与您的流量模式相匹配
速率限制不是一个一刀切的指标。一个在每秒请求数(RPS)上看起来慷慨的提供商,如果您突发超过每秒上限或打开太多 WebSocket 连接,仍然可能限制您的应用。在比较提供商之前,先规划您的工作负载:
- 读密集型应用(索引器、仪表盘)需要高 RPS,并且访问
getProgramAccounts或getSignaturesForAddress时不应有过于严格的限制。 - 写密集型应用(交易机器人、NFT 铸造器)需要一致的
sendTransaction吞吐量和低延迟的确认轮询。 - 实时应用(订单簿、钱包活动)需要足够的并发 WebSocket 连接和消息吞吐量。
对于大多数生产级 Solana 应用,选择具有透明速率限制和专用基础设施路径的托管提供商是最安全的选择。OnFinality 提供共享和专用 Solana RPC 选项,速率限制可根据您的需求扩展。请参阅 RPC 定价 和 Solana 网络页面 了解当前详情。
Solana RPC 速率限制的典型结构
Solana RPC 提供商通常从三个维度实施限制:
- 每秒请求数(RPS):每秒最大 JSON-RPC 调用次数。这是最常见的限制,通常按计划分层。
- 每日/每月请求量:一个计费周期内总请求数的上限。有助于估算成本,但与实时行为关系不大。
- WebSocket 连接和消息速率:可同时打开的 WebSocket 连接数以及可接收消息的频率。这对于订阅账户或程序更新的应用至关重要。
一些提供商还施加特定于方法的限制——例如,对 getProgramAccounts 或 getSignaturesForAddress 等昂贵调用设置较低的 RPS。这些可能比整体 RPS 上限更具限制性,因此请务必阅读细则。
突发与持续限制
提供商可能允许在声明的 RPS 之上进行短暂突发(例如,持续 10 RPS,突发 20 RPS 持续 5 秒)。突发允许量有助于处理峰值,但并不保证。如果您的应用经常超过持续限制,您将看到 429 错误或请求被丢弃。
跨 Solana RPC 提供商比较什么
评估提供商时,请关注以下标准。使用下表作为起点——然后在每个提供商的网站上验证当前详情。
| 提供商 | 免费层 RPS | 付费层 RPS | WebSocket 限制 | 专用节点 | 备注 |
|---|---|---|---|---|---|
| OnFinality | 中等,公平使用 | 可扩展,透明 | 可配置 | 是 | 共享和专用选项;请参阅 定价 |
| 提供商 A | 低(例如 5 RPS) | 较高(例如 50 RPS) | 连接数有限 | 是 | 可能有特定于方法的限制 |
| 提供商 B | 无 | 高(例如 100 RPS) | 慷慨 | 是 | 通常需要承诺 |
| 提供商 C | 低 | 中等 | 中等 | 否 | 仅专注于共享 |
注意:该表仅为说明性。请始终查看提供商当前文档以获取确切数字。
要问的关键问题
- 我需要的计划上的持续 RPS 是多少? 不仅仅是突发速率。
- 是否有特定于方法的限制? 例如,
getProgramAccounts可能比一般调用限制更低。 - 我可以打开多少个 WebSocket 连接? 一些提供商限制为 10 或 20 个;其他允许数百个。
- 当我超过限制时会发生什么? 您会收到 429 错误,还是提供商排队请求?
- 如果我超出共享限制,我可以升级到专用节点吗? 这对于扩展至关重要。
如何在承诺之前测试速率限制
您可以编写一个简单的脚本探测提供商的速率限制。使用一个循环发送请求并记录 HTTP 状态码。以下是一个使用 fetch 的 Node.js 示例:
const endpoint = 'https://solana.api.onfinality.io/public';
const body = {
jsonrpc: '2.0',
id: 1,
method: 'getHealth',
params: []
};
async function testRateLimit() {
let success = 0;
let rateLimited = 0;
for (let i = 0; i < 100; i++) {
try {
const res = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body)
});
if (res.status === 429) {
rateLimited++;
} else {
success++;
}
} catch (e) {
console.error('Error:', e);
}
await new Promise(r => setTimeout(r, 100)); // 10 RPS
}
console.log(`Success: ${success}, Rate limited: ${rateLimited}`);
}
testRateLimit();
针对不同提供商运行此脚本,以查看它们在持续负载下的表现。还要通过打开多个订阅并监控断开连接来测试 WebSocket 连接。
比较速率限制时的常见陷阱
- 忽略特定于方法的限制:提供商可能宣传 50 RPS,但仅允许
getProgramAccounts5 RPS。这可能会破坏索引器。 - 忽视 WebSocket 限制:如果您的应用需要 100 个并发订阅,而提供商限制为 20 个连接,则会导致失败。
- 假设免费层足以用于生产:免费层用于测试,而非生产。它们通常具有低 RPS 且无 SLA。
- 不检查突发行为:一些提供商允许短暂突发,但持续负载仍可能触发限制。
- 忘记归档数据:如果您需要历史状态,请确保提供商提供具有足够速率限制的归档节点。
何时选择专用 Solana 节点
共享 RPC 计划对于中等流量具有成本效益,但它们的限制可能成为瓶颈。在以下情况下考虑专用节点:
- 您的应用在共享计划上持续达到 RPS 上限。
- 您需要可预测的性能,用于高频交易或大规模索引。
- 您需要自定义速率限制或希望避免嘈杂的邻居。
- 您需要无限制地访问归档数据或专用方法。
OnFinality 提供专用 Solana 节点,让您完全控制速率限制和性能。在 专用节点页面 了解更多。
如何规划速率限制余量
即使使用慷慨的计划,您也应该设计应用以优雅地处理速率限制:
- 对 429 响应实现指数退避重试。
- 缓存频繁访问的数据以减少 RPS。
- 尽可能使用 WebSocket 订阅而不是轮询,但注意连接限制。
- 监控您的使用情况以检测何时接近限制。
以下是一个简单的 JavaScript 重试模式:
async function rpcCall(method, params, retries = 3) {
const endpoint = 'https://solana.api.onfinality.io/public';
for (let i = 0; i < retries; i++) {
const res = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params })
});
if (res.status === 429) {
await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));
continue;
}
return res.json();
}
throw new Error('Rate limited after retries');
}
关键要点
- Solana RPC 的速率限制是多维的:RPS、每日量和 WebSocket 并发数。
- 特定于方法的限制可能比整体 RPS 更具限制性。
- 在承诺之前,使用您的实际工作负载测试提供商。
- 共享计划适用于中等流量;专用节点提供可预测的性能。
- 始终通过重试和缓存来设计以应对速率限制错误。
常见问题解答
Solana RPC 提供商的典型免费层 RPS 是多少?
免费层通常在 2 到 10 RPS 之间,但一些提供商可能为测试提供更高的限制。请始终检查当前条款。
我可以在共享计划上获得无限 RPS 吗?
没有提供商在共享计划上提供真正无限的 RPS。专用节点是获得更高、可预测限制的途径。
WebSocket 限制如何影响我的应用?
如果您的应用依赖实时更新,您需要足够的并发 WebSocket 连接。超过限制将导致断开连接或错误。
如果我经常遇到速率限制,该怎么办?
首先,通过缓存和批处理优化您的应用。如果仍然遇到限制,请考虑升级到更高计划或专用节点。
OnFinality 是否提供专用 Solana 节点?
是的,OnFinality 提供专用 Solana 节点。请访问 专用节点页面 了解详情。