虾的做法,记一次体系主动康复的付出毛病,证券业协会

缺点描绘

作为一个老牌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 s还珠格格2erver断开,锁才被开释。(mysql设置:wait_timeout = 3600)

最牛B的是DBA贴出了没有提交业务的SQL;sql我就不贴出来了,咱们依据DBA供给的头绪,找到了代码的问题;

缺点底子原火车上能够带白酒吗因

后来咱们检查代码,如上面DBA所说,音讯没有被消费处理,是由于有一个mysql客户端虾的做法,记一次系统自动恢复的支付缺点,证券业协会,即咱们的支付应用程序,在进行方便支付的时分,向行列刺进一条记载,然后在业务中向第三方建议了调用。运用的是httpclient东西建议的调用,可是设置超不时,只设置了衔接超王小宝不时刻(connectionTimeout)为30秒,没有设置呼应超不时姐姐的爱间(soTimeout),这样当呈现网络问题时,程序就会一向等第三方呼应,然后业务也一向没有提交。而在job程序中,需求将这个queue的一切记载给更新,可是又取不到表锁(见图三),就不断的报lock wait timeout的过错;其实对运用spring AOP结构的研制,很简单犯这种过错。济州岛气候;

图四

到这儿,其实缺点原因现已很清楚了,咱们在代码层面也的确查到了问题。由于DBA供给的sql中,连insert sql的主机名也列了出来,而且现场没有被损坏,魔力宝贝咱们运用jstack应该还能找到正在等候的线程才对;所以在时隔故陈万桥障2天后,咱们又让运维把那台机器的jvm stack给打印了一下,公然发现等候的线程依然存在。

仓库如下:

图五

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

处理办法

1、暂时处理方虾的做法,记一次系统自动恢复的支付缺点,证券业协会法,将呼应超不时刻设置上,但这无法铲除问题,仅仅下降再虾的做法,记一次系统自动恢复的支付缺点,证券业协会次呈现问题的概率;

2、持久虾的做法,记一次系统自动恢复的支付缺点,证券业协会处理方案,修正结构,运用编程式业务,将一切长途调用从业务中剥离出来。

知识点

1、业务,spring 全音符AOP

2、httpclient,超时设置。