摘要
没有单一最快的 Solana RPC 端点,因为延迟取决于你的应用运行位置、调用的方法以及是否需要 WebSocket 或归档数据。实用的方法是从你自己的区域针对实际使用的方法测量往返时间,然后在共享 RPC 和专用 Solana 节点之间做出选择。OnFinality 提供 Solana RPC API 访问和专用节点基础设施,因此你可以从共享端点开始,当工作负载需要时再迁移到专用容量。
如何确定哪个 Solana RPC 对你来说最快
“最快”不是端点的固定属性。它是一种测量结果,取决于四件事:
- 你的应用在哪里运行。 与你的服务器位于同一区域的节点通常会胜过世界另一端的节点。
- 你调用哪些方法。
getLatestBlockhash和sendTransaction的行为与getProgramAccounts或长时间范围的getSignaturesForAddress非常不同。 - 你是否需要 WebSocket。 流式
slotSubscribe或logsSubscribe的延迟特性与一次性 HTTP 调用不同。 - 你是否共享端点。 共享 RPC 池会吸收许多用户的流量;专用节点为你的工作负载提供自己的容量。
快速决策方法:
| 你的情况 | 首先尝试什么 |
|---|---|
| 原型开发、低流量、无严格延迟目标 | 通过 HTTPS 的共享 Solana RPC |
| 需要快速获取最新区块哈希的交易机器人或钱包 | 共享 RPC,然后从你的区域进行基准测试 |
高请求量、大量 getProgramAccounts 或日志查询 | 专用 Solana 节点 |
| 实时订阅(slot、日志、账户变更) | 支持 WebSocket 的端点 |
| 合规或隔离要求 | 你控制的专用节点 |
如果你还不确定,先从共享端点开始,进行测量,只有当数据证明合理时才迁移到专用容量。OnFinality 同时提供 Solana RPC API 访问 和 专用节点,因此你可以在不更换提供商的情况下完成过渡。
什么真正让 Solana RPC 变快
Solana 大约每 400 毫秒产生一个区块,因此对于大多数应用来说,网络本身不是瓶颈。你感受到的延迟通常来自你的代码与响应请求的验证者或 RPC 节点之间的路径。
关键因素:
- 地理距离。 往返时间主要由物理距离决定。从法兰克福到东京节点的请求在任何处理发生之前就会增加几十毫秒。
- 节点健康状况和负载。 落后于链尖或请求饱和的节点无论距离如何都会响应缓慢。
- 方法成本。 像
getBalance这样的轻量方法返回很快。像getProgramAccounts这样的重量方法会扫描大量状态,可能需要更长时间。 - 连接复用。 每个请求建立新的 TLS 连接会增加开销。Keep-alive 和连接池很重要。
- WebSocket 与 HTTP。 订阅将数据推送给您,这可能比轮询更快,但需要稳定的连接和重连逻辑。
这就是为什么仅列出提供商的“最快 Solana RPC”列表不太有用。正确的问题是:从哪个区域,以什么量级,对哪些方法最快?
从你自己的环境对 Solana RPC 延迟进行基准测试
不要相信从别人的机器上测量的延迟数字。从你的应用实际运行的地方进行测量。
使用 curl 的简单 HTTP 计时循环:
# 替换为你自己的端点(共享或专用)
ENDPOINT="https://solana.api.onfinality.io/public"
for i in $(seq 1 20); do
curl -s -o /dev/null -w "%{time_total}\n" \
-X POST "$ENDPOINT" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getLatestBlockhash","params":[{"commitment":"confirmed"}]}'
done
从每个候选区域运行此命令,并比较分布,而不仅仅是平均值。查看中位数和尾部(p95、p99),因为尾部延迟才是伤害交易机器人和面向用户钱包的因素。
要进行更真实的测试,请对你应用实际调用的方法进行基准测试:
# 更重的方法:单独测量
curl -s -o /dev/null -w "%{time_total}\n" \
-X POST "$ENDPOINT" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot","params":[{"commitment":"processed"}]}'
使用 fetch 和 performance.now() 的 JavaScript 版本:
const endpoint = "https://solana.api.onfinality.io/public";
async function timeCall(method, params = []) {
const start = performance.now();
const res = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
});
await res.json();
return performance.now() - start;
}
(async () => {
const samples = [];
for (let i = 0; i < 20; i++) {
samples.push(await timeCall("getLatestBlockhash", [{ commitment: "confirmed" }]));
}
samples.sort((a, b) => a - b);
console.log("median ms:", samples[Math.floor(samples.length / 2)].toFixed(1));
console.log("p95 ms:", samples[Math.floor(samples.length * 0.95)].toFixed(1));
})();
从同一台机器、在一天中的同一时间,对每个你正在考虑的端点运行相同的脚本。在高峰和非高峰时段重复。
共享 RPC 与专用 Solana 节点
一旦你有了数据,下一个决定是共享端点是否足够,还是需要专用容量。
| 维度 | 共享 Solana RPC | 专用 Solana 节点 |
|---|---|---|
| 设置工作量 | 连接即可使用 | 需要配置和设置 |
| 成本模型 | 基于使用量,入门成本较低 | 固定容量,高流量下可预测 |
| 负载下的延迟 | 随其他租户变化 | 对你的工作负载保持一致 |
重量方法(getProgramAccounts、日志范围) | 可能受限或较慢 | 根据你的需求调整大小 |
| WebSocket 订阅 | 共享端点支持 | 支持,拥有自己的连接预算 |
| 隔离性 | 共享基础设施 | 隔离到你的项目 |
| 最适合 | 原型、钱包、中等流量 | 交易系统、索引器、高吞吐量应用 |
OnFinality 的 RPC API 服务 涵盖共享访问,专用节点 在共享性能不足时为你提供隔离容量。查看 RPC 定价 了解两种模型在你的流量下的比较。
链设置和连接详情
对于 Solana 主网,标准连接详情为:
| 设置 | 值 |
|---|---|
| 链名称 | Solana Mainnet |
| 原生货币 | SOL(9 位小数) |
| HTTP RPC | https://solana.api.onfinality.io/public |
| WebSocket RPC | wss://solana.api.onfinality.io/public-ws |
| 区块浏览器 | https://explorer.solana.com |
JavaScript 中的钱包或应用网络配置:
const solanaMainnet = {
name: "Solana Mainnet",
rpcUrl: "https://solana.api.onfinality.io/public",
wsUrl: "wss://solana.api.onfinality.io/public-ws",
explorer: "https://explorer.solana.com",
nativeCurrency: { name: "SOL", symbol: "SOL", decimals: 9 },
};
如果你在主网之前进行测试,请使用 Solana Devnet 并通过 Solana CLI 或钱包从 devnet 水龙头请求空投。Devnet 端点与主网分开,不应用于生产流量。
WebSocket 订阅及其对延迟的重要性
在紧密循环中轮询 getSlot 或 getLatestBlockhash 会浪费请求,并且仍然落后于链尖。订阅会在更新发生时推送。
// 使用 ws 端点获取 slot 更新
const ws = new WebSocket("wss://solana.api.onfinality.io/public-ws");
ws.onopen = () => {
ws.send(JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "slotSubscribe",
params: [],
}));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.method === "slotNotification") {
console.log("new slot:", data.params.result.slot);
}
};
WebSocket 连接需要重连逻辑和心跳处理。如果你的应用无法容忍连接断开,请为关键读取(如 sendTransaction 之前的区块哈希获取)保留 HTTP 回退。
追求 Solana RPC 速度时的常见故障模式
- 过期的区块哈希。 如果你的 RPC 落后于链尖,
sendTransaction会因区块哈希过期而失败。在签名前立即获取新的区块哈希。 - 共享端点上的速率限制。 大量轮询或大型
getProgramAccounts调用可能触及限制。批量请求或迁移到专用容量。 - 错误的区域。 错误区域的快速提供商对你来说很慢。始终从你自己的基础设施进行基准测试。
- 忽略尾部延迟。 良好的中位数但糟糕的 p99 仍会导致超时。同时跟踪两者。
- 没有故障转移。 如果你唯一的端点发生事故,你的应用就会停止。配置辅助端点和健康检查。
你可以定期运行的最小监控探针:
#!/usr/bin/env bash
ENDPOINT="https://solana.api.onfinality.io/public"
START=$(date +%s%3N)
RESP=$(curl -s -X POST "$ENDPOINT" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}')
END=$(date +%s%3N)
echo "latency_ms=$((END-START)) response=$RESP"
当延迟超过阈值或 getHealth 不再返回 ok 时发出警报。
关键要点
- “最快”的 Solana RPC 是一种测量结果,而不是标签。从你自己的区域针对实际调用的方法进行基准测试。
- 共享端点适合原型和中等流量;专用节点为高流量或重量方法工作负载提供一致的延迟和隔离。
- 使用 WebSocket 订阅获取实时数据,但为关键写入保留 HTTP 回退。
- 关注尾部延迟(p95、p99),而不仅仅是平均值。
- 始终配置辅助端点并监控健康状况,这样单个事故不会导致应用宕机。
- OnFinality 提供 Solana RPC API 访问和专用节点基础设施;详情请参阅 支持的 RPC 网络 和 RPC 定价。
常见问题
是否有一个 Solana RPC 端点总是最快的? 不。延迟取决于你的区域、调用的方法和端点负载。从你自己的环境进行测量。
我需要专用 Solana 节点吗? 只有当共享端点无法满足你的延迟、流量或隔离需求时才需要。从共享开始,进行基准测试,然后扩展。
OnFinality 支持 Solana WebSocket 吗? 是的。Solana 主网端点支持 HTTP 和 WebSocket 传输。连接详情请参阅 Solana 网络页面。
如何快速测试 Solana RPC 速度?
从同一台机器对每个候选端点运行简短的 curl 或 fetch 循环,并比较中位数和 p95 延迟。
devnet 呢? 使用 Solana Devnet 进行测试,使用主网端点进行生产。不要混用。
在哪里可以比较提供商选项? 评估标准请参阅 如何选择 RPC 提供商,成本模型请参阅 RPC 定价。