摘要
Sui RPC 速率限制是公共和共享端点按 API 密钥、IP 或时间窗口施加的请求上限。它们的存在是为了保持节点对所有人响应迅速,但它们也决定了你的应用在流量高峰、回填和事件密集型工作负载期间能做什么。本文解释了如何在 Sui 上识别速率限制响应,如何测量你的真实请求概况,以及何时共享端点不再适合。它还涵盖了实用选项:请求整形、缓存、批处理,以及当你需要可预测的容量时迁移到专用 Sui 节点基础设施。
快速诊断:你的 Sui 应用真的被限流了吗?
在更换提供商或重写索引器之前,确认限流是真正的原因。Sui RPC 速率限制通常表现为以下信号之一:
- RPC 端点返回 HTTP
429 Too Many Requests响应。 - JSON-RPC 错误对象,消息涉及请求限制、配额或请求过多。
- 突然的延迟飙升,请求仍然成功但耗时更长。
- 部分失败:批处理中的某些调用成功,其他被拒绝。
- 负载下 WebSocket 或订阅断开连接。
如果你只在部署、回填或流量峰值期间看到这些,你几乎肯定遇到了请求上限,而不是节点故障。如果它们在低流量下持续发生,请检查你的 API 密钥、端点 URL,以及你是否意外发送了重复请求。
一个快速的确认方法是记录每次调用的 HTTP 状态和 JSON-RPC 错误体,然后统计每分钟的失败次数。下表将常见症状映射到可能的原因。
| 症状 | 可能原因 | 首先检查 |
|---|---|---|
大多数调用返回 429 | 按密钥或按 IP 的请求上限 | 每秒请求率与你的计划对比 |
仅重型方法返回 429 | 方法级别或计算加权限制 | 哪些方法主导你的流量 |
| 响应缓慢,无错误 | 节点饱和或排队 | 随时间变化的 p95 延迟 |
| 订阅断开 | 连接或订阅限制 | 重连逻辑和订阅数量 |
| 仅来自一个区域的错误 | 网络路径或区域端点 | 每个部署区域的延迟 |
一旦你知道看到的是哪种模式,下一步就是决定是减少负载、改变调用 Sui 的方式,还是迁移到容量与你的工作负载匹配的基础设施。
Sui RPC 限制通常如何构成
Sui 暴露了一个 JSON-RPC 接口,大多数提供商在多个层面施加限制。理解这些层面有助于你预测会在哪里碰壁。
按密钥的请求速率。 最常见的限制是与 API 密钥绑定的每秒请求数(RPS)或每分钟请求数(RPM)。公共端点通常按 IP 地址施加此限制,这意味着共享的 NAT 或 CI 运行器可以消耗其背后所有人的预算。
计算加权限制。 并非所有 Sui 方法的成本相同。一个简单的 sui_getLatestCheckpointSequenceNumber 很便宜。返回大量对象集、交易历史或事件流的方法消耗更多节点资源,可能被更重地加权或单独限制。
负载和响应大小上限。 大的 sui_getEvents 或对象查询可能受响应大小或结果数量限制,与请求速率无关。
连接和订阅限制。 WebSocket 连接、活动订阅和并发流通常与 HTTP 请求速率分开限制。
突发与持续限制。 许多提供商允许短暂突发超过稳态速率,然后如果你持续在该水平则进行限流。这对于快速追赶然后空闲的索引器很重要。
因为这些限制因提供商和计划而异,实际方法是测量你自己的流量概况,并将其与端点文档中记录的限制进行比较。如果你的提供商没有明确记录方法级别或订阅限制,在规划容量时将其视为风险。
首先测量你真实的 Sui 请求概况
不知道你实际发送什么,就无法选择正确的修复方法。对你的客户端进行插桩,按方法记录:
- 峰值和平均每秒调用次数。
- p50、p95 和 p99 延迟。
- 按状态码和 JSON-RPC 错误码的错误率。
- 重试次数以及重试如何放大负载。
- 并发 WebSocket 订阅数量。
一个小型监控探针可以使这些可见。例如,一个采样轻量级 Sui 方法并记录状态和延迟的 Node.js 脚本:
// monitor-sui.js
const ENDPOINT = process.env.SUI_RPC_URL; // your Sui RPC endpoint
async function probe() {
const started = Date.now();
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "sui_getLatestCheckpointSequenceNumber",
params: []
})
});
const body = await res.json();
console.log({
status: res.status,
ms: Date.now() - started,
error: body.error ? body.error.message : null
});
}
setInterval(probe, 1000);
从与你的生产工作负载相同的区域运行此脚本。如果你看到以你未预料到的速率出现 429 响应,你的有效限制低于你的计划所暗示的,或者有其他东西在共享你的密钥。
要从命令行直接进行 JSON-RPC 检查:
curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" \
-X POST "$SUI_RPC_URL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"sui_getLatestCheckpointSequenceNumber","params":[]}'
如果你需要一个可用的端点进行测试,请从 Sui RPC 网络页面 开始,并使用那里列出的端点用于你的环境。
在更换提供商之前减少负载
有时最便宜的修复是发送更少、更智能的请求。这些模式在不改变基础设施的情况下减少 Sui RPC 压力:
- 在 API 支持的地方进行批处理。 JSON-RPC 批处理请求允许你将多个调用合并到一个 HTTP 往返中,这可以减少每个请求的开销,并帮助你保持在请求速率上限之下。
- 缓存不可变数据。 检查点、最终交易和历史对象不会改变。将它们缓存在本地或 Redis 中,而不是重新获取。
- 使用订阅而不是轮询。 如果你每秒轮询新的检查点或事件,订阅或调整良好的轮询间隔可以大幅减少请求量。
- 添加抖动退避。 没有退避的重试会将短暂的限流变成持续的过载。使用带抖动的指数退避和重试预算。
- 分离读取路径。 将重型分析或回填作业路由到与用户面向应用不同的端点或密钥,这样其中一个工作负载就不会饿死另一个。
- 精简结果集。 只请求你需要的字段,并对大型查询进行分页,而不是一次性拉取所有内容。
这些更改通常为早期阶段的应用提供足够的余量。它们也使你的流量概况更清晰,这有助于你以后评估专用容量。
当共享 Sui 端点不再适合时
共享和公共端点是合理的起点。当你的工作负载具有以下任何特征时,它们就会成为约束:
- 持续请求速率接近或超过你的计划上限。
- 大量使用事件查询、对象查询或历史数据。
- 许多并发 WebSocket 订阅。
- 对用户面向交易的严格延迟要求。
- 多个团队或服务共享一个 API 密钥。
- 回填和索引器与生产流量竞争。
此时,决策不再是寻找更大的共享计划,而是你是否需要不与其他客户共享的容量。专用 Sui 节点基础设施为你提供一个(或一组)为你的工作负载配置的节点,因此你的吞吐量不受其他租户流量的影响。OnFinality 提供 RPC API 访问和 专用节点 选项,因此你可以从共享开始,并随着请求概况的增长迁移到专用容量。
选项比较:共享 RPC、更高层级 RPC、专用节点
| 选项 | 最适合 | 主要约束 | 需要验证什么 |
|---|---|---|---|
| 公共端点 | 原型设计、低流量脚本 | 共享的按 IP 或按密钥上限 | 文档化的限制和稳定性 |
| 共享托管 RPC(例如 OnFinality RPC API) | 具有中等、可预测流量的生产应用 | 计划级别的 RPS/RPM 和方法权重 | 速率限制、方法支持、归档访问 |
| 更高层级的共享 RPC | 具有突发和更重读取模式的应用 | 仍与其他租户共享 | 突发策略、订阅限制 |
| 专用 Sui 节点 | 高持续吞吐量、索引器、延迟敏感应用 | 成本更高,需要容量规划 | 节点规格、区域、归档/追踪支持、故障转移 |
OnFinality 的 RPC API 服务 旨在让团队可以从共享端点开始,并迁移到专用节点,而无需改变集成模式。有关当前计划详情,请参阅 RPC 定价。
Sui RPC 生产就绪检查清单
在扩展 Sui 工作负载之前,使用此检查清单:
- 了解每个方法的峰值 RPS。 不仅仅是总请求数,还有哪些方法占主导。
- 以书面形式确认你的计划限制。 请求速率、方法权重、负载上限和订阅限制。
- 实现退避和重试预算。 永远不要在紧密循环中重试。
- 添加回退端点。 第二个提供商或专用节点可降低单点故障风险。
- 持续监控错误代码。 对
429速率发出警报,而不仅仅是总错误。 - 分离工作负载。 为索引器和用户面向流量提供不同的密钥或端点。
- 测试故障转移。 模拟你的主端点失败,并确认你的应用优雅降级。
- 为增长做计划。 估算当前流量 2 倍和 5 倍时的请求量,并检查你的计划是否仍然适合。
如果其中几项对你当前的提供商不明确,那就是评估替代方案的信号。RPC 提供商选择指南 更详细地介绍了这些标准。
看起来像速率限制的常见错误
并非所有失败都是限流。这些问题产生类似的症状:
- 错误的网络或端点。 将 Sui 客户端指向测试网端点,或反之,会产生看起来像拒绝的错误。
- 格式错误的 JSON-RPC 负载。 缺少
params数组或方法名错误会返回错误,而不是速率限制。 - 过期或轮换的 API 密钥。 无效密钥可能以类似于限流的方式被拒绝。
- 签名交易中的时钟或 nonce 问题。 交易提交失败通常与请求速率无关。
- DNS 或 TLS 问题。 间歇性连接错误在负载下可能模仿限流。
在假设速率限制之前,检查 JSON-RPC 错误代码和消息。429 和明确的配额消息指向限流;方法未找到或无效参数错误指向客户端错误。
关键要点
- Sui RPC 速率限制通常按 API 密钥或 IP 施加,并且通常包括方法级别或计算加权的上限。
429响应、延迟飙升和订阅断开是限流的主要信号。- 在更换提供商之前,按方法测量你的请求概况;重试可以显著放大负载。
- 批处理、缓存、订阅和退避通常可以解决早期阶段的限流。
- 当持续吞吐量、大量事件查询或许多订阅超过共享限制时,专用 Sui 节点基础设施是更可预测的选择。
- OnFinality 提供 Sui RPC API 访问和专用节点;查看 支持的 RPC 网络 和 RPC 定价 了解当前详情。
常见问题
Sui 有内置的 RPC 速率限制吗? Sui 本身是一个网络;速率限制由暴露端点的 RPC 提供商和节点运营商施加。公共端点通常施加按 IP 的限制,而托管提供商施加按密钥的限制,因计划而异。
Sui 速率限制错误是什么样的?
最常见的是 HTTP 429 Too Many Requests 状态,有时带有描述配额或请求限制的 JSON-RPC 错误体。一些提供商返回通用错误消息,因此记录完整响应。
我可以通过使用多个 API 密钥来避免速率限制吗? 有时可以,但请检查你的提供商条款。许多提供商按账户聚合限制,将请求分散到多个密钥可能违反使用政策。更清晰的路径是减少负载或迁移到与你的工作负载匹配的容量。
我什么时候应该迁移到专用 Sui 节点? 当你的持续请求速率接近你的计划上限时,当重型事件或历史查询占主导时,当你运行许多并发订阅时,或者当延迟敏感的流量与批处理作业共享端点时。
OnFinality 提供 Sui RPC 吗? 是的。OnFinality 提供 Sui RPC API 访问和专用节点选项。查看 Sui 网络页面 了解端点详情,查看 RPC 定价 了解计划信息。
如何测试我的应用是否被限流? 从你的生产区域对你的端点运行一个轻量级探针,记录状态码和延迟,并将失败模式与你的请求速率进行比较。如果失败在流量高峰时聚集,限流是可能的原因。