摘要
地理分布式 Solana RPC 之所以重要,是因为 Solana 的时隙时间和确认窗口很短,因此用户、后端和验证者集合之间的物理距离直接决定了交易上链的速度。单区域端点可能在仪表板上看起来没问题,但其他大洲的用户却要承受延迟。
本文解释了如何评估地理分布式 Solana RPC 服务:需要测量什么、如何测试跨区域的故障转移,以及共享端点在何处不再足够。它还涵盖了何时专用节点或像 OnFinality 这样的托管 RPC API 更适合你的工作负载。
“地理分布式”对 Solana 究竟改变了什么
Solana 大约每 400 毫秒产生一个时隙,并且与大多数 L1 相比最终确认速度很快。这种节奏正是地理分布式在 Solana 上不是营销复选框的原因——它是一个延迟预算问题。用户、RPC 端点和验证者之间的每一毫秒都是你的应用等待确认的时间。
地理分布式 RPC 服务在多个区域运行节点,并将你的请求路由到附近的节点。实际上,这意味着三件不同的事情,提供商经常将它们混为一谈:
- 区域端点——每个区域有单独的 URL,因此你可以自己固定流量。
- Anycast 或智能路由——一个主机名解析或路由到最近的健康节点。
- 复制后端——相同的账户状态和交易提交路径可从多个位置获得。
只有第三项能完全保护你。提供商可能有十个区域,但仍然通过一个集群汇集所有写入。在评估服务时,检查你实际购买的是这三者中的哪一个。
决策指南:共享、地理路由还是专用?
在比较供应商之前,先确定你的工作负载需要哪类服务。大多数团队在启动时过度购买,在扩展时购买不足。
| 你的工作负载 | 需要关注什么 | 典型适用 |
|---|---|---|
| 原型、脚本、低容量读取 | 公共或共享端点通常就足够了 | 公共端点,例如 https://solana.api.onfinality.io/public |
| 用户分布在 2 个以上大洲的消费者应用 | 区域端点或 Anycast 路由,加上文档化的故障转移 URL | 托管 RPC API |
| 交易机器人、清算人、高频写入 | 来自靠近验证者集合的固定区域的可预测延迟,无邻居干扰共享 | 专用节点 |
| 索引器、分析、回填 | 归档历史,高 getProgramAccounts 和日志量,批量友好的限制 | 具有归档访问权限的专用节点 |
| 具有严格 SLO 的钱包和 dApp | 多区域故障转移、WebSocket 订阅、按密钥的可观测性 | 托管 RPC API 加上专用回退 |
如果你不确定自己属于哪一类,从托管端点开始并测量。Solana RPC 网络页面列出了 OnFinality 暴露的传输和端点,RPC 定价显示了共享和专用层级的区别。当你的 p95 延迟或订阅丢失率开始驱动产品决策时,这就是迁移到专用节点的信号。
区分真正地理分布式与区域列表的指标
提供商页面倾向于宣传区域数量。区域数量是页面上最没用的数字。以下这些才是改变结果的:
按区域而非全球的首字节时间。 要求提供用户所在区域的 p50 和 p95。全球平均值会掩盖对你来说实际缓慢的区域。
写入路径延迟,而不仅仅是读取。 getLatestBlockhash 和 sendTransaction 是决定用户是否看到确认的调用。提供商可能在 getBalance 上很快,但在提交上很慢。
时隙滞后。 为你服务的节点落后于尖端多远?在 Solana 上,这比原始 HTTP 延迟更重要,因为落后几个时隙的节点会拒绝或延迟基于过时区块哈希构建的交易。
WebSocket 稳定性。 订阅(slotSubscribe、accountSubscribe、logsSubscribe)是长期存在的。地理分布式服务如果 WebSocket 路由不佳,会在重连或故障转移时断开它们。明确测试重连行为。
故障转移语义。 当区域降级时,你的客户端会收到错误、重定向,还是静默切换到状态不同的节点?静默切换是最难调试的。
按区域的速率和方法限制。 一些提供商按密钥应用限制,一些按区域,一些按 IP。在一个区域看起来慷慨的限制可能在所有区域共享。
自己测试地理分布
不要依赖提供商的 status 页面。从你关心的区域运行一个小型探测。一个测量时隙滞后和写入路径延迟的最小检查如下:
# 从你服务的每个区域运行。比较各区域的时隙和延迟。
ENDPOINT="https://solana.api.onfinality.io/public"
for i in 1 2 3; do
curl -s -X POST "$ENDPOINT" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot","params":[{"commitment":"confirmed"}]}' \
-w "\nconnect=%{time_connect}s ttfb=%{time_starttransfer}s total=%{time_total}s\n"
done
然后比较各区域返回的 result(时隙)。如果两个区域报告的时隙相差超过一两个时隙,则其中一个滞后,来自该区域的写入将不太可靠。
对于 WebSocket 行为,订阅并观察间隙:
import WebSocket from "ws";
const ws = new WebSocket("wss://solana.api.onfinality.io/public-ws");
let lastSlot = 0;
ws.on("open", () => {
ws.send(JSON.stringify({
jsonrpc: "2.0", id: 1,
method: "slotSubscribe",
params: []
}));
});
ws.on("message", (raw) => {
const msg = JSON.parse(raw.toString());
const slot = msg?.params?.result?.slot;
if (slot) {
if (lastSlot && slot - lastSlot > 4) {
console.warn(`slot gap: ${lastSlot} -> ${slot}`);
}
lastSlot = slot;
}
});
ws.on("close", () => console.warn("socket closed — check reconnect logic"));
在高峰流量窗口期间至少运行一小时。正常操作期间的间隙和重连比任何基准测试截图都更有说服力。
客户端配置的 Solana 链设置
如果你将 Solana 接入钱包或前端,请保持链元数据与你实际目标网络一致。对于 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 |
对于开发和测试,使用 Solana Devnet,这样你就不会在迭代上花费真实的 SOL。将 devnet 和 mainnet 配置放在单独的环境变量中——混合它们是“我的交易消失了”报告最常见的原因之一。
地理分布式在生产中何处失效
即使分布良好的服务也有值得规划的故障模式。
提交时的过时区块哈希。 如果你的端点滞后,sendTransaction 会失败并出现区块哈希未找到之类的错误。修复:从你提交的同一区域获取区块哈希,并使用新的区块哈希重试,而不是重新提交相同的负载。
订阅风暴。 重连时,幼稚的客户端会一次性重新订阅所有内容。如果你有数千个账户,请错开重新订阅并限制并发。
跨区域状态偏差。 两个区域可能短暂地在尖端上不一致。如果你的后端从一个区域读取并通过另一个区域写入,你可能会针对写入路径已经越过的时隙构建交易。尽可能将给定用户会话的读取和写入固定到同一区域。
跟随密钥而非区域的速率限制。 从五个区域使用的单个 API 密钥可能共享一个预算。如果你在地理上分散客户端,请在扩展之前确认限制是按密钥还是按区域。
静默故障转移到降级节点。 如果你的提供商自动故障转移,请记录每个请求由哪个区域服务,以便将延迟峰值与路由变化关联起来。
值得告警的监控信号
地理分布式设置需要区域感知的监控,而不是单一的全局健康检查。
- 每个区域的时隙滞后,当超过小阈值时告警。
sendTransaction和getLatestBlockhash的 p95 延迟,按区域拆分。- 每个订阅的 WebSocket 重连次数和时隙间隙计数。
- 按 JSON-RPC 方法的错误率,这样单个昂贵的方法不会隐藏在健康的平均值后面。
- 每个请求由哪个区域服务,以便故障转移事件在你自己的仪表板中可见。
如果你在这些信号上比较供应商,提供商选择指南更详细地介绍了评估标准,支持的 RPC 网络列表显示了相同方法在 Solana 之外的应用。
关键要点
- Solana 上的地理分布式是延迟和时隙滞后问题,而不是区域数量徽章。
- 检查提供商是否提供区域端点、智能路由和复制写入路径——它们不是一回事。
- 从用户所在区域测量时隙滞后和写入路径延迟,而不是从一个基准位置。
- WebSocket 稳定性和故障转移行为决定了订阅能否在区域事件中存活。
- 从共享或托管端点开始,然后在延迟或限制开始影响产品决策时迁移到专用节点。
- OnFinality 提供 Solana RPC 作为托管 API 和专用节点基础设施,因此你可以从小规模开始并以相同方式扩展。
常见问题
地理分布式 RPC 会减少 Solana 确认时间吗? 它减少了往返中的网络部分。确认仍然取决于验证者集合和网络条件,但更近、滞后更少的端点消除了可避免的延迟。
如果我的用户是全球的,我可以只使用一个区域吗? 可以,但远离该区域的用户将看到更高的延迟和更多在拥塞期间失败的提交。带有故障转移的第二个区域通常是第一个有意义的升级。
如何知道我的提供商的区域是真实的? 从每个区域运行上面的探测并比较时隙和 TTFB。如果每个区域返回的延迟与一个位置几乎相同,你可能正在访问 CDN 后面的单个集群。
何时应从共享端点迁移到专用节点? 当你需要可预测的延迟、更高的方法或速率限制、归档历史或与其他租户流量隔离时。专用节点是通常的下一步。
OnFinality 支持 Solana WebSockets 吗? 是的——Solana 端点同时暴露 HTTP 和 WebSocket 传输。请参阅 Solana 网络页面了解当前端点和传输。