记Kafka消费的一次生产故障处理过程

开发 架构
因为我们是按业务领域拆分多个微服务的,为了解耦订单与资金平台,我们选择了MQ异步消息的方式进行业务数据传递。

大家好,欢迎来到Tlog4J课堂,我是Jensen。

记录今天发生的一次生产故障以及故障处理全过程。

问题背景

需求背景是这样的:产品要求订单过售后期后,资金平台需要对这些订单进行结算,并把虚拟资产入账到下单客户的虚拟账户。

因为我们是按业务领域拆分多个微服务的,为了解耦订单与资金平台,我们选择了MQ异步消息的方式进行业务数据传递,流程简化如下:

  1. 【订单中心】查询已过售后订单 -> 发送MQ消息给财务中心。
  2. 【财务中心】接收MQ消息 -> 校验客户交易数据 -> 调用资金平台结算积分。
  3. 【资金平台】结算积分 -> 虚拟资产入账。

其中,财务中心MQ消费使用了一个基于Kafka二次封装的组件,默认通过应用内线程池异步消费消息进行业务处理(因为需要在多个地方消费),这个二开的组件也已经用了一年时间,相对较为稳定。

记Kafka消费的一次生产故障处理过程

OK,到这一步没有发现什么问题。

接下来,不出意外的话马上就会发生意外。

凌晨6点触发P1级告警,由于应用内线程池被撑爆,应用走拒绝策略737次,触发SQL慢查询持续10秒(刚好校验客户交易数据操作用到了非索引列查数据库)。

随后进行了问题排查,分析完生产者、消费者端的代码,发现有以下问题:

  1. 消费端财务中心对应的消费方法使用了默认的异步方式处理消息,线程数大小用了默认的200个线程,如果短时间内接收多条MQ而又无法快速执行完释放线程,线程数达到200个必然会走拒绝策略报错,甚至影响其它异步执行MQ的消费者方法(共用了同一个线程池)。
  2. 订单中心同一时刻批量修改已过售后订单,把发送MQ的方法包在了for循环中。这意味着如果同一时刻发送大量MQ消息,又因为第一条消费者存在的隐患,将导致发送的MQ消息无法被正常消费。

处理过程

分析完问题,基本上能确定如何解决了,分三步:

第一步:对于线上消费异常的数据,按照代码逻辑重新跑SQL修复相应数据。这件事需要第一时间做,不能因为程序的问题影响客户体验。

第二步:该MQ组件异步消费的消息堆积能力受线程池大小影响,应该把消息堆积的问题交给专业的MQ自己负责,所以暂时关掉该Topic的异步执行,不用线程池,改为同步。后续对该MQ组件进行优化,不再提供异步执行方式,如使用类似@KafkaListener(topic = "xxx", groupId = "

appName.beanName.methodName")的方式,只不过需要动态创建KafkaListener,利用MQ本身消费者组的功能,避免消息堆积在应用线程池内。

第三步:通过业务规避,合理评估需求,对于已经确定的场景,能合并的MQ请求、SQL请求、Feign接口调用请求,比如上面提到的for循环发送订单已过售后通知、校验客户交易数据、资金平台积分入账场景,把它们识别出来,通过批量合并请求的方式解决频繁请求可能发生的问题(以空间换频率)。请求合并后还需要评估合并请求的大小限制,进一步进行请求切割,比如订单合并后有10万条数据,放在一个请求里也不合理,应该按照一定的订单量切割后再发送请求。

这里分享一个领导(技术总监)用了8年的需求分析方法:

记Kafka消费的一次生产故障处理过程

总结一下

对于此类生产问题,分三步解决:

  • 第一,第一时间修复生产数据,避免影响客户体验。
  • 第二,找出临时解决方案——找出问题根因针对性解决。
  • 第三,长远的问题规避方案——合理评估需求。
责任编辑:姜华 来源: 今日头条
相关推荐

2019-09-08 17:52:10

数据库log file sy等待事件

2020-11-03 07:34:12

Kafka后端工程师

2021-02-01 09:00:34

Ceph octopu集群运维

2021-01-12 07:57:36

MySQLBinlog故障处理

2018-07-18 15:37:24

数据库DB2故障处理

2019-12-12 10:38:10

mysql数据库nnodb

2018-12-06 16:25:39

数据库服务器线程池

2021-03-01 06:14:50

环境高并发延迟

2019-08-15 11:30:06

SQL数据库ASH

2019-12-27 10:43:48

磁盘数据库死锁

2020-09-25 07:57:42

生产事故系统

2019-07-25 08:30:58

数据库服务器故障

2019-11-18 13:42:55

MySQL数据库迁移

2019-08-19 01:34:38

数据库SQL数据库优化

2019-11-22 08:05:01

数据库mysql分区

2019-01-21 11:17:13

CPU优化定位

2021-12-06 17:21:05

异常报错故障

2020-12-15 11:18:43

系统磁盘lvm数据库

2021-12-02 07:50:30

NFS故障内存

2019-12-16 07:18:42

数据库SQL代码
点赞
收藏

51CTO技术栈公众号