1.生产环境NoHttpResponseException异常排查记录
生产环境NoHttpResponseException异常排查记录
业务背景
公司为邮储银行开展的源码营销活动,规则是源码用户支付一分钱后获得元现金券,活动结束后系统自动退还1分钱。源码此需求由C端业务小组负责,源码而我主要负责B端支付模块。源码我们设计的源码asio源码讲解业务逻辑为用户在C端小程序进行支付,C端将请求转给B端支付模块,源码B端向微信下单,源码等待支付完成后再通知C端交易完成并返回支付方式,源码接着C端判断支付方式,源码若是源码邮储银行卡则发券,最后C端调用B端支付模块进行退款。源码为了清晰展示这一流程,源码活动自动通知源码我精心绘制了系统调用时序图。源码
生产环境发现的源码问题 1、NoHttpResponseException导致退款失败
功能上线后,开始监控B端支付模块的交易数据,发现有未退款订单。检查日志后确认支付回调正常,视频源码找不到下游系统响应成功,但B端支付模块未进行退款。联系C端同事,暂时通过接口退款。深入排查C端系统问题,发现退款请求异常信息,selenium获取网站源码揭示了网络问题导致双方系统间未正常交互。
异常情况分析
仅凭日志,初步分析为服务端主动断开TCP链接,客户端在半断开链接时发起请求,服务端响应RST包引发此异常。多数资料建议捕获NoHttpResponseException异常进行重试。网址前查看源码进一步验证此猜想,发现服务端模拟FIN包后,HttpClient重新创建TCP链接,需深入源码解释现象。
验证思路与NoHttpResponseException复现
通过阅读HttpClient源码,找到关键逻辑点:在三次握手前检查TCP链接状态,若为Open则复用链接,否则新建链接。据此复现NoHttpResponseException现象,抓包结果表明服务端断开连接,客户端发起请求导致异常。
解决方案与引发的思考
业务层面,考虑建立补偿机制应对退款失败风险。同时,优化网络层面,初始化HttpClient时添加重试策略。通过此次问题解决,深刻认识到网络环境的不确定性及其对业务系统的影响,提醒我们在设计时应考虑更全面的异常处理和重试机制,以提升系统的健壮性。