AWS S3 Async客户端故障后无法获取新连接的问题咨询
以下是导致应用在DDoS场景后长期无法恢复、必须重启的关键原因:
连接池资源永久泄漏
高并发冲击下,请求处理异常可能导致连接未被正确归还到连接池。例如:当请求抛出未被捕获的异常时,AWS SDK的SdkHttpFullResponse或Netty的Channel未被触发关闭逻辑,连接池中的可用连接被永久占用。即使后续流量恢复正常,池内也没有可用连接分配给新请求,持续触发获取超时异常。Netty事件循环线程池阻塞
Netty的EventLoop线程负责处理所有IO操作和连接管理,如果在DDoS期间,业务代码在EventLoop线程中执行了阻塞操作(如同步数据库查询、锁等待、耗时计算),会导致线程被永久挂起。一旦EventLoop线程池全部阻塞,连接的释放、超时清理等核心逻辑无法执行,整个客户端的连接管理彻底停摆,无法自动恢复。AWS SDK连接池状态不一致
高并发场景下,SDK内部连接池的计数逻辑可能出现异常,比如已使用连接数的统计值远大于实际占用的连接数。此时连接池会错误地认为所有连接都在被使用,拒绝分配新连接,但实际这些连接早已被释放。这种状态异常属于SDK内部的逻辑bug,无法自行修复,必须重启应用重置连接池状态。僵死TCP连接未被清理
DDoS期间建立的大量TCP连接,可能因异常中断进入TIME_WAIT或CLOSE_WAIT状态。如果系统TCP参数未优化(如tcp_fin_timeout、tcp_tw_reuse未开启),这些僵死连接会持续占用进程的文件描述符。同时,如果AWS SDK或Netty未配置定时清理僵死连接的逻辑,即使过了数小时,这些资源仍无法释放,新请求无法创建连接。SDK重试/限流机制死锁
高并发下,SDK的重试机制或限流逻辑可能出现死锁。例如:重试线程互相等待对方释放连接池资源,导致整个请求处理链路卡住。这种死锁状态无法自行解除,必须重启应用才能重置所有线程和内部状态。
内容的提问来源于stack exchange,提问作者user3790053

