大家好,欢迎来到Tlog4J课堂,我是Jensen。
记录今天发生的一次生产故障以及故障处理全过程。
需求背景是这样的:产品要求订单过售后期后,资金平台需要对这些订单进行结算,并把虚拟资产入账到下单客户的虚拟账户。
因为我们是按业务领域拆分多个微服务的,为了解耦订单与资金平台,我们选择了MQ异步消息的方式进行业务数据传递,流程简化如下:
其中,财务中心MQ消费使用了一个基于Kafka二次封装的组件,默认通过应用内线程池异步消费消息进行业务处理(因为需要在多个地方消费),这个二开的组件也已经用了一年时间,相对较为稳定。
OK,到这一步没有发现什么问题。
接下来,不出意外的话马上就会发生意外。
凌晨6点触发P1级告警,由于应用内线程池被撑爆,应用走拒绝策略737次,触发SQL慢查询持续10秒(刚好校验客户交易数据操作用到了非索引列查数据库)。
随后进行了问题排查,分析完生产者、消费者端的代码,发现有以下问题:
分析完问题,基本上能确定如何解决了,分三步:
第一步:对于线上消费异常的数据,按照代码逻辑重新跑SQL修复相应数据。这件事需要第一时间做,不能因为程序的问题影响客户体验。
第二步:该MQ组件异步消费的消息堆积能力受线程池大小影响,应该把消息堆积的问题交给专业的MQ自己负责,所以暂时关掉该Topic的异步执行,不用线程池,改为同步。后续对该MQ组件进行优化,不再提供异步执行方式,如使用类似@KafkaListener(topic = "xxx", groupId = "
appName.beanName.methodName")的方式,只不过需要动态创建KafkaListener,利用MQ本身消费者组的功能,避免消息堆积在应用线程池内。
第三步:通过业务规避,合理评估需求,对于已经确定的场景,能合并的MQ请求、SQL请求、Feign接口调用请求,比如上面提到的for循环发送订单已过售后通知、校验客户交易数据、资金平台积分入账场景,把它们识别出来,通过批量合并请求的方式解决频繁请求可能发生的问题(以空间换频率)。请求合并后还需要评估合并请求的大小限制,进一步进行请求切割,比如订单合并后有10万条数据,放在一个请求里也不合理,应该按照一定的订单量切割后再发送请求。
这里分享一个领导(技术总监)用了8年的需求分析方法:
对于此类生产问题,分三步解决:
本文题目:记Kafka消费的一次生产故障处理过程
文章网址:http://www.shufengxianlan.com/qtweb/news8/337608.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联