跳到主要内容

限流

公共 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 是重试前应等待的秒数。表现良好的客户端应:

  1. 尊重 Retry-After header。
  2. 对重复失败实现指数退避。
  3. 不要立即重试——那只是浪费双方资源。

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));

申请提额

如果你的集成确实需要比默认更多的余量,通过支持渠道联系团队。包括:

  • 你在构建什么。
  • 预期请求速率(每秒、每小时)。
  • 你最重度使用哪些方法。
  • 是否可以改成自建节点。

按合法应用逐案批准提额。

打公共端点前的替代方案

推极限前先考虑:

  1. 本地缓存读结果。 链状态每区块最多变一次。同一区块内对同一地址多次 eth_getBalance——缓存结果。

  2. 多个查询合并成一个 batch 请求。 Batch 格式见 JSON-RPC 概览

  3. 用事件订阅代替轮询。 用 WebSocket newHeadslogs 订阅,而不是在紧循环里轮询 eth_blockNumber

  4. 自建节点。 持续高流量下自建 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);

下一步