`
donlianli
  • 浏览: 339153 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Elasticsearch...
浏览量:217936
社区版块
存档分类
最新评论

记一次自动恢复的支付故障

 
阅读更多

故障描述

作为一个老牌OTA公司,公司早些年订单主要来源是PC网站和呼叫中心。我在入职公司大约半年后,遇到一次非常诡异的故障。有一天早上,大概也是这个季节,阳光明媚,程序猿刚起床,洗洗涮涮,准备去上班,却突然收到一大堆报警,线上消息队列大量积压;当然,我还是一如既往的非常勤奋地在9点之前就到公司的;但是作为一名新员工,环视四周,组内其他员工都还没到公司,运维也都在路上,故障就这样突然降临了。我赶紧开机登录堡垒机,连接线上机器,tail 错误日志。但是线上10几个系统,我看了好几个系统,都没有发现有什么错误,这就尴尬了。但是统计消息队列,超过好几千的消息待消费。我当时就在想,这些消息都是什么鬼。截图如下:

图一

看到这里,你一定会问数量为604和881个的消息是做什么?知道这些消息的逻辑不就解决问题了么?话说当时我也是这么想的,可是当时我作为一名新人,才开始接触业务不到3个月,还完全没有这么深的业务积累(这个时候知道业务是多么重要)。

既然系统看不到任何错误,我也没有什么办法了,当时因为刚入职没多久,还有点寄希望于领导来解决。转眼间半个小时已经过去,故障仍然没有恢复,从业务反馈来看,微信支付宝等支付方式不受影响。受影响的只是信用卡支付(其实当时信用卡量占比挺高)和分销支付(后来了解到,其实这两种模式都是信用卡支付模式)。领导还在堵车,运维也只是到了几个小兵,我找运维把几个机器的stack打印了一下,也没有发现什么问题;运维也陆续到岗,运维准备出大招,重启系统。但是就在此时,突然系统自动恢复了。所有积压的消息自动被消费,信用卡支付也可以了。好,系统竟然有自我修复功能,佩服;

 

故障原因分析

后来,经过一番努力,还是找到一点蛛丝马迹,我发现系统的一个消费消息的定时任务,在故障期间一直在报错,因为是高可用的job机制,4台机器,只有抢占到锁的服务器才能获取到访问数据库消息权利,所以报错信息比较分散,4台机器都有。

图二

 

可以判定,这个sql一直异常导致job根本无法获取到消息,而另外的生产者又不断的往队列放消息,进而导致消息积压。两个系统关系如下:

图三

 

虽然故障总结了,但是我们心里也不踏实,如何找到系统故障的根本原因,以防止以后再次出现这种故障呢?

方法有两种:

1、去查代码,所有跟这个表相关的sql,都需要仔细review一下,但是你也不一定能查到原因,因为这个场景肯定是不好复现的,要不然早就发现这个问题了。

2、借助外力,从DB层面查导致这个sql无法执行成功的原因;

 

方法1看似简单,其实非常不可行。首先,虽然跟这个表相关的sql,只有几十个,但是都是正常的sql,没有使用for update锁死表的sql。也没有存在未关闭的事务,因为事务是通过AOP配置的;

所以只能寄希望于方法2了,让DBA去查;

好歹我们的DBA足够给力,只用了1天多的时间就查出来了。

DBA回复如下:

1、有事务没有及时提交,且连接也没有关闭,导致该事务一直处于开启状态并持有锁,后续update操作是全表扫描,因此会有锁等待。

2、最后该连接后续一直没有操作,达到空闲超时3600秒(我们的故障时间正好也是1小时)后被mysql server断开,锁才被释放。(mysql设置:wait_timeout = 3600)

最牛B的是DBA贴出了没有提交事务的SQL;sql我就不贴出来了,我们根据DBA提供的线索,找到了代码的问题;

 

故障根本原因

后来我们查看代码,如上面DBA所说,消息没有被消费处理,是因为有一个mysql客户端,即我们的支付应用程序,在进行快捷支付的时候,向队列插入一条记录,然后在事务中向第三方发起了调用。使用的是httpclient工具发起的调用,但是设置超时时,只设置了连接超时时间(connectionTimeout)为30秒,没有设置响应超时时间(soTimeout),这样当出现网络问题时,程序就会一直等第三方响应,然后事务也一直没有提交。而在job程序中,需要将这个queue的所有记录给更新,但是又取不到表锁(见图三),就不断的报lock wait timeout的错误;其实对使用spring AOP框架的研发,很容易犯这种错误。我们从 https://tech.meituan.com/2018/04/19/trade-high-availability-in-action.html 这篇总结里面的1.5段也能看出,美团支付也在这块也栽过坑;

图四

 

到这里,其实故障原因已经很清楚了,我们在代码层面也确实查到了问题。因为DBA提供的sql中,连insert sql的主机名也列了出来,并且现场没有被破坏,我们使用jstack应该还能找到正在等待的线程才对;于是在时隔故障2天后,我们又让运维把那台机器的jvm stack给打印了一下,果然发现等待的线程仍然存在

堆栈如下:

图五

 

与之对应的代码,我就不贴了;

 

解决方法

1、临时解决方法,将响应超时时间设置上,但这无法根除问题,只是降低再次出现问题的概率;

2、长久解决方案,修改框架,使用编程式事务,将所有远程调用从事务中剥离出来。

 

 

知识点

1、事务,spring AOP

2、httpclient,超时设置

 

 求关注“猿界汪汪队”

分享到:
评论

相关推荐

    网络故障自动修复工具试用版

    《网络故障自动修复工具试用版》是一款专为Windows操作系统设计的实用软件,适用于Windows 2000和XP系统,但不兼容较新的Vista系统。无论你是使用台式机还是笔记本电脑,都可以顺利安装并使用这款工具。值得注意的是...

    个人自动发卡平台 -(已修复在线支付)_个人自动发卡平台-(已修复在线支付)_

    《个人自动发卡平台 - 已修复在线支付》 个人自动发卡平台是为独立卖家或小型企业设计的一种数字化商品销售系统,它允许商家快速、便捷地发行和销售虚拟产品,如游戏点卡、软件激活码等。在这个系统中,"已修复在线...

    支付宝插件修复工具

    总之,"alicreset(支付宝插件修复工具)"是解决支付宝插件故障的得力助手,通过其专业化的修复流程,能够帮助用户快速恢复插件功能,保障在线支付的顺畅进行。在日常使用中,遇到类似问题时,不妨尝试使用这样的专业...

    支付宝免签约即时到账接口软件工具全自动发收款货系统v3.12+源码全套

    支付宝免签约即时到账接口软件工具是一款专为电商、在线服务提供商等设计的自动化财务管理解决方案,主要功能在于实现快速、安全的支付与收款流程。这款全自动发收款货系统v3.12版本结合了源码,使得用户可以根据...

    码支付支付监控软件codepay.rar

    该软件的核心功能在于确保支付的成功回调,即在用户完成支付后,系统能够自动检测到这一变化,并触发相应的业务流程,如更新订单状态或发送通知。 在提供的压缩包文件中,包含了以下组件: 1. libeay32.dll和...

    信誉支付平台支付程序源码

    4. **错误处理与异常恢复**:源码中应有完善的错误处理机制,包括事务管理、重试策略和日志记录,确保系统在面对网络延迟、服务器故障等异常情况时能够快速恢复。 5. **用户体验**:良好的支付程序源码会注重用户...

    基于java支付扫描模块程序

    10. **持续集成与部署**:项目可能采用敏捷开发模式,因此需要支持持续集成和自动化部署,以快速响应需求变化和修复问题。 总的来说,"基于Java支付扫描模块程序"是一个涉及多方面技术的复杂系统,涵盖了支付接口的...

    支付宝支付核心业务说明书

    最后,文档可能会涵盖系统维护、性能优化和故障恢复策略,这些都是保证系统持续稳定运行的关键。例如,通过负载均衡、冗余备份和灾难恢复计划,来应对可能的服务中断。 总的来说,《支付宝支付核心业务说明书》涵盖...

    【聚合支付】抓娃娃机免签支付插件

    8. **故障处理与异常检测**:当支付过程中出现错误或异常时,插件应有自动恢复机制或提供清晰的错误提示,以便用户或维护人员能快速解决问题。 通过这样的支付插件,抓娃娃机不仅可以提高支付效率,还能吸引更多...

    微信支付宝语音提醒聚合A版V8.4.rar

    4. **稳定性**:软件的稳定性是其核心优势,能够保持长时间在线并处理支付交易,减少了因为软件故障造成的经济损失。 5. **兼容性**:支持微信和支付宝两大主流支付平台,覆盖了大部分用户的支付习惯,增加了收款的...

    简单的epay网上支付系统

    7. **异常处理与错误恢复**:考虑到网络问题或服务器故障,系统应具备错误处理和自动恢复机制,确保交易的稳定性和可靠性。 8. **用户体验**:一个优秀的支付系统不仅要在技术上过关,还要注重用户体验。界面设计应...

    Java支付全家桶企业级各类支付手段一站式解决方案

    ### Java支付全家桶企业级各类支付手段一站式解决方案 在当今高度数字化的世界中,无论是电子...无论是对于想要从事金融领域开发工作的初学者还是已经有一定经验的专业人士来说,这门课程都将是一次宝贵的学习经历。

    自动售货机系统开发相关文档

    6. **自动售货机**:自动售货机是一种通过电子支付或现金交易,无需人工干预即可完成商品销售的设备。其核心系统通常包括硬件控制系统、商品库存管理、用户交互界面、支付系统集成等多个部分。 7. **文档**:在IT...

    支付宝上网行为更改IP地址后策略恢复共2页.pdf.zip

    这种情况可能是由于网络服务提供商的设定、路由器的配置问题或者是某种自动恢复机制。在这种情况下,用户需要检查网络设置,确保更改IP的设置能够被正确保存和应用。 总的来说,理解和处理“支付宝上网行为更改IP...

    交通一卡通移动支付技术规范 第7部分:终端设备.pdf

    3. **异常处理能力**:在遇到网络故障等情况时,终端设备应能自动切换至离线模式,并保存相关交易数据,待网络恢复后再上传至后台系统。 4. **兼容性**:终端设备应具备良好的兼容性,能与市面上主流的一卡通卡进行...

    自动售货机模拟系统

    在IT行业中,自动售货机模拟系统是一种常见的教学或实践工具,它可以帮助开发者、学生以及对自动售货机业务感兴趣的人理解背后的工作原理和技术。自动售货机模拟系统的设计涉及多方面的技术,包括硬件交互、数据库...

    个人免签支付系统源码 云端监控 电脑端监控 价值6000免签支付系统1-10.zip

    通常,云端监控会结合日志分析、警报系统和自动化故障恢复策略,形成一个全面的监控体系。 在使用个人免签支付系统源码时,需要注意的是,虽然这样的系统提供了极大的灵活性和自主性,但同时也带来了相应的法律风险...

    RM.rar_hostel management_宿舍 管理系统_宿舍管理系统_故障管理 c_维修管理

    5. **故障反馈**:系统通知用户故障已修复,并收集用户反馈,确保问题得到解决。 【总结】 这个“RM.rar”压缩包可能包含了宿舍管理系统的源代码、数据库脚本、用户手册等相关文件。通过分析和学习这个系统,...

    自动售货机——实现自动售货、找零、并显示钱数

    5. 日志记录:记录每一次交易,便于后期分析和审计。 四、实现过程 1. 需求分析:明确售货机的功能需求,如支持的支付方式、商品种类、找零要求等。 2. 硬件选型:根据需求选择合适的组件,如微控制器、传感器、...

    简单记次餐饮使用说明

    简单记次餐饮系统是一款专为餐饮业设计的管理工具,旨在帮助餐厅、食堂等餐饮服务场所实现高效便捷的点餐、记账和管理功能。该系统通过数字化的方式,优化了传统的餐饮业务流程,提高了工作效率,降低了运营成本。 ...

Global site tag (gtag.js) - Google Analytics