摘要
QuickNode WebSocket Solana 是团队在将实时 Solana 订阅(账户变更、日志、slot 和签名)接入交易机器人、索引器或仪表板时常见的搜索。真正的决策不仅仅在于教程中出现的是哪个提供商名称,而在于你选择的 WebSocket 端点能否维持长连接、在重连后存活,并与你的 HTTP RPC 流量保持一致。
本页解释了 Solana WebSocket 订阅的实际工作原理,在任何提供商的 WebSocket 服务中需要验证什么,以及当你的工作负载超出共享端点时,如何评估 OnFinality 的 Solana RPC API 和专用节点等替代方案。
如果你搜索了“quicknode websocket solana”,你可能已经过了教程阶段。你已经知道 Solana 暴露了用于实时数据的 WebSocket 接口,并且想知道某个提供商的 WebSocket 端点是否是机器人、索引器或实时仪表板的正确长期选择。本页重点讨论这一决策:Solana WebSocket 订阅的行为方式、在承诺之前需要验证什么,以及共享端点何时不再足够。
你实际在选择什么
Solana 的 JSON-RPC 接口有两种传输方式。HTTP 处理请求/响应调用,如 getAccountInfo 或 sendTransaction。WebSocket 处理订阅:你打开一个持久连接,发送订阅请求,节点在新 slot、日志或账户变更发生时推送通知。WebSocket 端点是与 HTTP 端点不同的 URL,通常使用 wss:// 方案。
当查询指定某个提供商时,底层问题通常是以下之一:
- 该提供商的 Solana WebSocket 端点是否支持我的应用所需的订阅方法?
- 它能否维持许多并发连接而不掉线?
- 连接断开时会发生什么——我能获得干净的重连行为吗?
- WebSocket 端点是否与我的 HTTP 调用在同一个集群和 commitment 级别上?
这四个问题比搜索框中的品牌名称更重要。
快速推荐
在原型设计、运行少量订阅或构建可以容忍偶尔重连的仪表板时,使用共享的托管 WebSocket 端点。当你需要可预测的连接数、更严格地控制订阅负载或与其他租户的流量隔离时,使用专用 Solana 节点。
OnFinality 通过 HTTP 和 WebSocket 提供 Solana RPC,并在共享基础设施不再适合时提供专用节点选项。你可以查看 Solana 网络页面 了解端点详情,以及 RPC 定价 了解计划级别的差异。
你将订阅的 Solana WebSocket 方法
Solana 的订阅面比其 HTTP 方法列表小,但每个方法都有不同的负载特征。下表将常见订阅映射到它们发出的内容以及它们容易出问题的地方。
| 订阅 | 推送内容 | 典型用途 | 负载特征 |
|---|---|---|---|
slotSubscribe | 新 slot 通知 | Slot 计时、leader 跟踪 | 高频、低负载 |
logsSubscribe | 程序日志行 | 机器人触发、事件检测 | 高频、可能冗长 |
accountSubscribe | 账户数据变更 | 钱包或池状态跟踪 | 取决于账户活动 |
signatureSubscribe | 单个签名的确认 | 交易确认 | 短时、每笔交易 |
blockSubscribe | 完整区块数据 | 索引器、分析 | 重负载、资源密集 |
rootSubscribe | 已 root 的 slot 更新 | 最终性跟踪 | 低频 |
一个常见错误是使用宽泛的过滤器订阅 logsSubscribe 以覆盖所有程序,然后疑惑为什么连接饱和。按你实际关心的程序 ID 进行过滤,并优先使用 mentions 过滤器而不是未过滤的日志流。
使用 WebSocket 客户端连接和订阅
下面的示例使用 OnFinality Solana 公共 WebSocket 端点。将其视为本地测试的起点,而不是高容量工作负载的生产端点。
import WebSocket from "ws";
const ws = new WebSocket("wss://solana.api.onfinality.io/public-ws");
ws.on("open", () => {
// Subscribe to logs mentioning a specific program
ws.send(JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "logsSubscribe",
params: [
{ mentions: ["YourProgramIdHere"] },
{ commitment: "confirmed" }
]
}));
});
ws.on("message", (data) => {
const msg = JSON.parse(data.toString());
if (msg.method === "logsNotification") {
console.log("slot", msg.params.result.context.slot);
console.log(msg.params.result.value.logs);
}
});
ws.on("close", () => {
// Reconnect with backoff; do not reconnect in a tight loop
});
注意 commitment 参数。Solana 订阅接受 processed、confirmed 或 finalized。你的选择会改变延迟以及看到后来被回滚数据的风险。将订阅的 commitment 级别与后续 HTTP 调用的 commitment 级别匹配,否则你将构建出自我矛盾的状态。
提供商评估矩阵
在比较 Solana 的 WebSocket 服务时,根据相同的标准对每个提供商进行评分。以下列故意偏向运营而非营销。
| 提供商 | WebSocket 传输 | 订阅覆盖 | 连接模型 | Solana 工作负载注意事项 |
|---|---|---|---|---|
| OnFinality | Solana 上的 HTTP 和 WebSocket | 标准 Solana 订阅方法 | 共享 RPC 加专用节点选项 | HTTP 和 WS 同一平台;共享负载不足时可用专用节点 |
| QuickNode | 每条链的 WebSocket 端点 | 标准 Solana 订阅方法 | 共享和专用计划 | 文档完善;验证计划级别的连接限制 |
| Helius | WebSocket 加增强 API | 标准订阅加额外功能 | 共享和专用 | 强大的 Solana 工具;检查哪些功能受计划限制 |
| 公共集群端点 | 提供 WebSocket | 标准订阅 | 共享、未认证 | 适合测试;不适合生产连接数 |
这不是排名。这是一个检查清单。合适的提供商取决于你的连接数、对重连的容忍度,以及你是否希望 HTTP 和 WebSocket 在同一平台上。
生产就绪检查清单
在将生产机器人或索引器指向任何 Solana WebSocket 端点之前,请确认以下内容:
- 连接预算。 你的计划允许多少个并发 WebSocket 连接,超出时会发生什么?静默断开比明确的错误更糟糕。
- 重连策略。 你的客户端需要指数退避、重新订阅例程,以及一种在重连后检测丢失 slot 的方法。WebSocket 连接会断开;问题是你恢复得有多优雅。
- Commitment 对齐。 订阅和后续 HTTP 读取应使用相同的 commitment 级别。
- 心跳处理。 Solana 节点发送 ping 帧。如果你的客户端库不响应 ping,服务器可能会关闭连接。
- 背压。 如果你的处理程序很慢,通知会排队。决定是丢弃、缓冲还是异步处理。
- 可观测性。 记录连接打开/关闭事件、重新订阅次数和通知延迟。没有这些,你无法区分安静的市场和损坏的套接字。
- 故障转移。 如果你运行多个端点,确保你的故障转移逻辑重新订阅,而不是假设新连接继承旧订阅。
共享 WebSocket 端点何时停止工作
故障模式很少是戏剧性的。通常看起来像这样:你的订阅数增长,重连变得更频繁,通知延迟在繁忙时段逐渐上升。没有什么是坏的,但余量消失了。
是时候迁移到专用节点的信号:
- 你正在运行数百个并发订阅,需要将它们与其他租户隔离。
- 你需要在网络拥塞期间保持一致的行为,而不是尽力而为的共享。
- 你想为特定的订阅组合调整节点资源。
- 你需要一个稳定的端点,不会随着计划演变而变化。
OnFinality 的 专用节点 选项就是为这种过渡设计的。你保留相同的 RPC 接口,但底层节点是你的。如果你仍在共享和专用之间犹豫,提供商选择指南 会详细介绍权衡。
从一个 WebSocket 端点迁移到另一个
切换 Solana WebSocket 提供商主要是配置更改,但细节很重要:
- 更新两个 URL。 HTTP 和 WebSocket 端点通常一起更改。不要更新一个而忘记另一个。
- 重新测试 commitment 级别。 如果新提供商的默认值不同,你的应用行为会改变。
- 重放丢失的状态。 迁移后,在信任新的订阅数据之前,通过 HTTP 重新获取账户状态。
- 短暂并行运行两者。 在旧端点和新端点上订阅,比较通知,然后切换。
- 保留旧端点作为后备。 在第一周,第二个端点是很便宜的保险。
如果你从公共集群端点迁移到托管端点,同样的步骤适用——只是预期可靠性会有更大的提升。
调试 Solana 上的 WebSocket 问题
| 症状 | 可能原因 | 首先检查 |
|---|---|---|
| 连接在几秒后关闭 | 客户端未响应 ping 帧 | 你的 WebSocket 库的 ping/pong 处理 |
| 订阅后没有通知 | 过滤器太窄,或 commitment 错误 | 订阅调用中的 params 对象 |
| 重复通知 | 多个订阅或重连时未取消订阅 | 重新订阅逻辑 |
| 高峰时段延迟 | 共享端点争用 | 连接数和提供商计划限制 |
| 重连后丢失 slot | 没有间隙检测 | 处理程序中的 slot 连续性跟踪 |
大多数 Solana WebSocket 问题可追溯到客户端的重连和重新订阅逻辑,而不是端点本身。先修复客户端,然后评估提供商。
关键要点
- Solana WebSocket 是与 HTTP 不同的传输方式,用于
logsSubscribe、slotSubscribe和accountSubscribe等订阅。 - 提供商名称不如连接限制、重连行为和 commitment 对齐重要。
- 共享端点适合原型和轻量仪表板;专用节点适合高连接数或延迟敏感的工作负载。
- OnFinality 通过 HTTP 和 WebSocket 支持 Solana,并在共享基础设施不足时提供专用节点选项。
- 在责怪端点之前,始终实现退避、重新订阅和间隙检测。
常见问题
OnFinality 是否支持 Solana WebSocket 订阅?
是的。OnFinality 通过 HTTP 和 WebSocket 暴露 Solana。请参阅 Solana 网络页面 了解当前端点详情。
公共 Solana WebSocket 端点是否足以用于生产?
对于低容量测试,是的。对于具有许多并发订阅的生产机器人或索引器,托管或专用端点通常是更安全的选择。
订阅应使用什么 commitment 级别?
对订阅和后续的 HTTP 读取使用相同的 commitment 级别。confirmed 是常见的默认值;finalized 以延迟换取更强的保证。
我可以为 HTTP 和 WebSocket 使用同一个提供商吗?
可以,而且通常简化操作。将两种传输方式放在一个平台上意味着同一组凭据、同一个计费关系,以及一致的 commitment 行为。
如何公平地比较 Solana WebSocket 提供商?
根据连接限制、订阅覆盖、重连行为、commitment 默认值以及是否提供专用节点对每个提供商进行评分。忽略你无法测试的营销声明。
准备好超越共享端点了吗?查看 RPC 定价 和完整的 支持的 RPC 网络 列表,规划你的下一步。