You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS EC2(Elastic Beanstalk)上Ethers.js tx.wait()几小时后阻塞问题

排查思路与解决方案

1. 优化Ethers.js Provider的连接策略

  • 长时间运行后,默认Provider可能因连接超时、重连机制缺失导致半开连接,无法接收链上回执。手动配置Provider的超时与重连参数:
    const provider = new ethers.providers.JsonRpcProvider(YOUR_RPC_URL, {
      timeout: 30000, // 设置30秒超时
      retryCount: 5,
      retryDelay: 1000
    });
    
  • 监听Provider的error事件,出现异常时自动重建连接;或定期重置Provider实例(比如每2小时),避免长期复用单一连接。

2. 排查EC2实例的网络资源限制

  • 用netstat -an | grep ESTABLISHED | wc -l命令查看当前TCP连接数,对比t3.medium实例的连接数上限,避免耗尽出站连接导致无法与RPC节点通信。
  • 检查EB负载均衡(ELB)的空闲连接超时配置(默认60秒),若Provider长连接超过该时长会被强制断开,需调整ELB超时或在代码中设置连接保活机制。

3. 监控实例资源占用情况

  • 用top或htop定期查看CPU、内存占用,排查Node.js内存泄漏问题(可配合node --inspect和Chrome DevTools分析)。
  • 检查系统日志/var/log/messages和应用日志/var/log/nodejs/nodejs.log,确认是否有OOM killer触发、内存不足的记录。

4. 增强RPC节点的可靠性

  • 切换到备用RPC节点测试,或配置多节点轮询机制,避免单一节点限流/故障导致tx.wait()停滞。
  • 为tx.wait()添加超时包装,防止无限等待:
    const waitWithTimeout = (promise, timeoutMs) => {
      return Promise.race([
        promise,
        new Promise((_, reject) => setTimeout(() => reject(new Error('Wait timeout')), timeoutMs))
      ]);
    };
    
    // 调用示例
    try {
      receipt = await waitWithTimeout(tx.wait(), 60000); // 60秒超时
    } catch (err) {
      console.error('交易回执等待超时:', err);
      // 可在此处补充重新查询交易状态的逻辑
    }
    

5. 调整EB应用服务器配置

  • 若使用PM2等进程管理器,配置内存阈值触发自动重启,避免内存泄漏积累导致事件循环阻塞。
  • 检查EB环境变量,确认NODE_ENV等参数是否影响Node.js的网络或运行机制,比如production环境下的默认连接池配置差异。

内容的提问来源于stack exchange,提问作者toofun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:53:17