限流
公共 OXN RPC 端点应用限流以防滥用并保证所有用户可用性。本页记录限制是什么、如何应对。
限制
限流按源 IP 地址计。具体数字可能变化;当前指引通过支持渠道联系团队。
粗略的当前限制(可能变):
- 标准 JSON-RPC 请求:每 IP 每秒数请求。
- Batch 请求:batch 大小有限(经验值每批 25 条以内)。
- WebSocket 订阅:每 IP 并发连接数有限;每连接订阅数有限。
- 重型调用(
eth_getLogs宽范围 ):消耗多个配额单位。 debug_*方法:高负载下可能整个禁用。
超限行为
超过限制时服务器返回:
HTTP/1.1 429 Too Many Requests
Retry-After: N
N 是重试前应等待的秒数。表现良好的客户端应:
- 尊重
Retry-Afterheader。 - 对重复失败实现指数退避。
- 不要立即重试——那只是浪费双方资源。
ethers.js 中的处理示例:
import { ethers } from "ethers";
async function withRetry(fn, maxAttempts = 5) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
try {
return await fn();
} catch (err) {
if (err.code !== 429) throw err;
const wait = Math.min(1000 * 2 ** attempt, 30_000);
console.log(`Rate limited. Waiting ${wait}ms`);
await new Promise((r) => setTimeout(r, wait));
}
}
throw new Error("Rate limited too many times");
}
// 用法
const balance = await withRetry(() => provider.getBalance(addr));
申请提额
如果你的集成确实需要比默认更多的余量,通过支持渠道联系团队。包括:
- 你在构建什么。
- 预期请求速率(每秒、每小时)。
- 你最重度使用哪些方法。
- 是否可以改成自建节点。
按合法应用逐案批准提额。
打公共端点前的替代方案
推极限前先考虑:
-
本地缓存读结果。 链状态每区块最多变一次。同一区块内对同一地址多次
eth_getBalance——缓存结果。 -
多个查询合并成一个 batch 请求。 Batch 格式见 JSON-RPC 概览。
-
用事件订阅代替轮询。 用 WebSocket
newHeads与logs订阅,而不是在紧循环里轮询eth_blockNumber。 -
自建节点。 持续高流量下自建 RPC 节点比公共端点更可靠、可预测。见运行只读 RPC 节点。
监控你的使用
公共端点当前不暴露每用户使用计数器。你可以客户端测量自己的请求速率:
let requestCount = 0;
provider._perform_orig = provider._perform;
provider._perform = function(...args) {
requestCount++;
return this._perform_orig(...args);
};
setInterval(() => {
console.log("Requests in last minute:", requestCount);
requestCount = 0;
}, 60_000);
下一步
- JSON-RPC 概览——batch 与其他优化模式
- 公共 RPC 端点——可用性与总体政策
- 运行只读 RPC 节点——需要更多容量时