Solana RPC与WebSocket调用限制及并发提升方案咨询
Solana RPC并发调用限流问题解决方案
问题描述
使用solana-go库调用SendAndConfirmTransaction接口时,并发100次会触发429限流错误;将并发量降至50次时单次调用可行,但重复执行仍会触发限流。
代码示例
_, err = confirm.SendAndConfirmTransaction( context.TODO(), this.getRpcClient(), this.wsClient, tx, ) if err != nil { panic(err) }
报错信息
panic: (*jsonrpc.RPCError)(0x140001a1800)({ Code: (int) 429, Message: (string) (len=83) "Connection rate limits exceeded, contact your app developer or support@rpcpool.com.", Data: (interface {}) <nil> })
Solana RPC与WebSocket限制规则
- 公共节点通用限制:免费/公共RPC节点(如rpcpool)会基于以下维度管控流量:
- 并发连接数:WebSocket连接存在上限,
SendAndConfirmTransaction会同时占用RPC请求和WS监听通道,并发时资源消耗翻倍 - 请求频率:单位时间内(分钟/秒级)的请求总数有阈值,重复连续请求容易触发
- 单IP管控:基于请求来源IP设置流量配额,单IP持续请求很快会触达上限
- 并发连接数:WebSocket连接存在上限,
- 接口额外消耗:
SendAndConfirmTransaction并非单一请求,而是先提交交易到RPC,再通过WebSocket监听确认状态,一次调用占用两个资源通道,比单纯提交交易更容易触发限流
提升并发调用量的可行方法
- 切换付费RPC服务:付费节点(如QuickNode、Ankr的Solana专属节点)提供更高的速率配额、更大的并发连接数,还能获得专属技术支持,从根源上解决限流问题
- 实现限流与重试逻辑:
- 用令牌桶/漏桶算法控制并发请求数,将并发稳定控制在40以内(低于50的安全阈值)
- 添加指数退避重试,遇到429错误时自动重试,示例代码如下:
import "github.com/cenkalti/backoff/v4" err = backoff.Retry(func() error { _, err := confirm.SendAndConfirmTransaction( context.TODO(), this.getRpcClient(), this.wsClient, tx, ) if err != nil { if rpcErr, ok := err.(*jsonrpc.RPCError); ok && rpcErr.Code == 429 { return err } return backoff.Permanent(err) } return nil }, backoff.NewExponentialBackOff()) if err != nil { panic(err) }
- 复用客户端连接:确保RPC和WebSocket客户端全局复用,不要每次请求创建新实例,避免额外的连接开销触发限流
- 批量交易优化:如果业务允许,将多个交易合并为批量提交(注意Solana单批量交易的大小限制,最大为1232字节),减少请求总数
- 分散请求来源:通过多IP地址分散请求,避免单IP的流量阈值被触发,需注意服务商的合规条款
内容的提问来源于stack exchange,提问作者Javin Yang
相关产品推荐
相关产品推荐

