尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

eRPC智能批处理:1000个并发请求如何变成1次上游调用

eRPC智能批处理:1000个并发请求如何变成1次上游调用 eRPC智能批处理1000个并发请求如何变成1次上游调用【免费下载链接】erpceRPC — fault-tolerant evm rpc proxy项目地址: https://gitcode.com/gh_mirrors/erpc1/erpceRPC 是一款高容错fault-tolerant的 EVM/Solana RPC 代理它的核心杀手锏之一就是智能批处理当 1000 个客户端在同一瞬间发出相同的请求时eRPC 会自动把它们折叠成1 次真实的上游调用每个调用者都能拿到属于自己的响应副本。本文将带你完整搞懂这套批处理 请求复用multiplexing机制是如何工作的以及如何用最少的配置让它为你省钱。高并发 RPC 的三个隐形成本如果你的节点上跑着钱包、行情看板、区块轮询器你会发现一个残酷的事实重复请求1000 个浏览器标签页同时轮询eth_blockNumber上游节点被同一份数据打 1000 次HTTP 开销每条调用都要独立建连、握手、序列化、限流计费限流配额按请求计费的供应商Alchemy、QuickNode 等会在流量尖峰时直接烧穿你的预算。eRPC 用三层互相独立的批处理机制把这三笔开销全部砍掉上图是 eRPC 官方模拟器界面可以直观看到流量从 Client 进入 eRPC 路由层、再分发到多个上游Upstream的完整链路——批处理就发生在这一层。第一层入站批处理 —— 一次 HTTP 请求并行执行如果你给 eRPC 发送的是一个 JSON 数组JSON-RPC 批处理格式它会检测到请求体首字节是[立即识别为批处理把数组拆成 N 个子请求每个子请求在独立 goroutine 中并行执行任何一个子请求失败甚至 panic都只影响数组里对应的那一个位置其余照常返回。对调用方来说钱包只需一次fetch就能同时拿到余额、nonce 和链 ID。这一层完全自动无需任何配置。 实现细节erpc/http_server.go 中的批处理检测与并行分发erpc/http_batch_resp.go 中的BatchResponseWriter以流式方式逐条写出响应数组整个响应从不完整缓存在内存中千条批处理也不会撑爆内存。第二层出站重组批 —— N 条调用合并成 1 个 POST更狠的是反方向eRPC 可以把来自不同客户端的 N 条独立调用重新打包成一个 JSON-RPC 数组向支持批处理的上游只发 1 次 HTTP POST。启用只需在上游配置里加 3 个参数参数作用建议值jsonRpc.supportsBatch: true打开出站批处理默认关闭truejsonRpc.batchMaxSize: 100攒够多少条立即发送100~200jsonRpc.batchMaxWait: 50ms兜底定时器未满也强制发送50ms⚠️避坑指南batchMaxSize和batchMaxWait必须同时设置非零值——只设一个另一个会退化成每条立即刷出批处理形同虚设。另外如果你的调用方总是复用同一个 JSON-RPCid比如永远传 1会触发提前刷出浪费攒批效果。 攒批队列与定时器刷新的完整实现见 clients/http_json_rpc_client.go字段定义在 common/config.go。第三层在途请求复用 —— 1000 个并发变 1 次上游调用这是标题中魔法的来源Multiplexer请求复用器。当 1000 个并发请求方法相同、参数相同哪怕 JSON-RPCid不同同时到达时eRPC 会算指纹用方法名 参数 SHA-256生成去重哈希id不参与哈希所以 id 不同的相同请求照样能合并选主第一个注册该哈希的请求成为Leader正常走缓存查询和上游调用其余 999 个成为Follower只是挂在一个等待通道上分副本Leader 拿到结果后每个 Follower 深拷贝一份响应并把id改回自己请求的原始 id——调用方完全感知不到自己被合并了安全清理Leader 结束后先删除哈希表项、再等所有 Follower 拷贝完成才释放响应内存杜绝 use-after-free。 核心实现erpc/multiplexer.goLeader 关闭与副本克隆、erpc/networks.gohandleMultiplexing选主、waitForMultiplexResult等待、cleanupMultiplexer清理。官方压测 erpc/networks_multiplexer_test.go 验证了 10 并发、50 并发、3 波×10 并发下每批恰好只有 1 次上游调用。 注意 SolanaSVM链的特殊处理base58 地址是大小写敏感的eRPC 为 SVM 单独派生了去重键避免仅大小写不同的两个账户被错误合并——这是很多简单哈希去重方案会踩的坑。1000 个并发请求上游到底收到几次调用假设 1000 个看板同时轮询eth_blockNumber且你的配置是入站自动批处理 出站攒批 复用开启一次流量尖峰的处理过程是阶段发生了什么上游视角① 入站数组请求被并行拆开各自计算去重哈希0 次② 复用999 个 Follower 挂到 Leader 的等待通道0 次③ 缓存Leader 命中本地/共享缓存0 次④ 兜底若缓存未命中Leader 发起唯一一次上游调用1 次⑤ 返回1000 个调用方各拿到id正确的独立响应—官方文档把这层机制称为in-flight deduplication: N concurrent identical calls → 1 upstream round-trip。完整说明可参考 docs/pages/operation/batch.mdx。如何验证批处理真的在省钱eRPC 内置了 Prometheus 指标最直接的一个是erpc_network_multiplexed_request_total—— 每有 1 个请求被合并去重就 1Leader 本身不计入这个计数器的值就是被省掉的真实上游调用次数。你可以在监控面板里对比接收请求速率与上游请求速率两条曲线差值越大批处理省得越多配套的大盘配置Grafana 仪表盘 Prometheus 告警规则都在仓库的 monitoring/ 目录下直接拷走就能用。开启建议谁该开谁该关✅保持开启复用默认开启缺省即 ON行情看板、钱包前端、区块高度轮询——大量热点相同读取收益最大出站攒批适合每秒数百条eth_getLogs的索引器把 HTTP 开销和按次计费压到最低。❌建议关闭multiplexing: false每条请求参数都唯一的索引任务——去重几乎不命中反而多付锁竞争排查问题时想逐条追踪上游调用依赖非幂等方法且 eRPC 无法可靠判重的场景。小技巧用networkDefaults.multiplexing一次性为项目内所有网络设置默认值再只对热点网络单独覆盖配置最干净。一句话总结eRPC 的智能批处理 入站并行拆分 出站攒批重组 在途请求复用三层组合拳让 1000 个并发相同请求只产生 1 次上游调用让 100 条独立调用共享 1 个 HTTP POST。对按量计费的 RPC 用户来说这不只是性能优化而是真金白银的成本削减——而且除 3 个可选参数外几乎零配置即可生效。【免费下载链接】erpceRPC — fault-tolerant evm rpc proxy项目地址: https://gitcode.com/gh_mirrors/erpc1/erpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表