案例背景
某电商平台订单处理系统采用分布式微服务架构,其概要结构图如下,核心流程通过分布式消息服务Kafka集群实现异步解耦:
订单创建:用户在前端提交订单,请求经过负载均衡器转发至订单服务集群。订单服务处理业务逻辑,生成包含订单详情的消息数据,并将该消息可靠地发送至Kafka集群的特定Topic。
下游处理:库存服务(负责扣减库存)、支付服务(负责发起支付请求)和物流服务(负责生成物流配送单)是主要的下游消费者。它们各自订阅Kafka集群中的相应Topic,并行地拉取并处理消息。
Kafka集群作为异步通信的核心,其稳定性和性能对整个订单系统的可用性至关重要。在高并发的场景下,Kafka Broker可能会面临各种异常情况,其中CPU负载过高是常见的一种,可能由突发流量洪峰、JVM垃圾回收或底层基础设施瓶颈等原因引起。Kafka Broker的CPU高负载会直接影响消息的处理速度,导致生产和消费的延迟,甚至引发整个系统的不稳定。
故障演练服务提供了分布式消息服务Kafka-Broker节点CPU高负载演练动作,通过模拟这种真实的故障场景,我们可以量化分析Kafka集群在Broker节点CPU受限时的表现,验证订单处理系统及其下游服务对Kafka异常的容忍度和应对能力,并提升团队在真实故障发生时的异常响应与恢复能力。
演练准备
开通应用高可用-故障演练服务产品
开通分布式消息服务Kafka产品
搭建一套独立的演练环境,包含:
开通与生产配置(版本、节点数、Topic划分、副本数等)一致的Kafka实例。
部署订单服务、库存服务、支付服务、物流服务等应用模块,连接开通的Kafka实例。
准备模拟用户行为的压测工具和脚本,配置业务监控和日志采集,便于观察系统运行表现。
演练实施
创建环境
在左侧菜单栏点击故障演练->环境概览,进入环境列表界面。
点击创建环境,填写环境基本信息后点击确定完成环境创建。
创建应用
在环境列表界面找到刚才创建的环境,进入应用列表界面点击创建应用,填写应用的基本信息。
在资源配置栏目点击分布式消息服务Kafka->添加资源,根据资源池与实例信息筛选Kafka实例,点击确定完成应用创建。
演练编排
在应用列表界面,找到已创建的应用,点击右侧的演练任务->新建演练,根据界面指引填写演练的基本信息,点击下一步进入演练对象配置界面。
在演练对象配置界面填写动作组名称、动作组描述,资源类型选择分布式消息服务Kafka,点击添加实例,选择待演练的实例后点击确定。
在动作列表栏目点击立即添加,选择演练动作Broker节点CPU高负载,点击下一步进行动作参数设定,点击确定完成动作添加。
| 演练参数名称 | 配置值 |
|---|---|
| 持续时间(秒) | 240 |
| CPU占用率 | 99 |
| 故障注入模式 | 全部注入 |
在全局配置界面,点击监控指标栏目下的添加云产品监控,在弹出的配置界面中添加以下监控项目:
云产品监控->分布式消息服务Kafka->CPU使用率、磁盘读流量、磁盘写流量、磁盘平均读操作耗时、磁盘平均写操作耗时、存活节点数、节点存活状态。
确认指标已经添加后,设置演练超时时间为120分钟,点击完成。
记录基线
在执行故障注入前,需要模拟业务流量,建立稳定的基线。
连接分布式消息服务Kafka实例,创建业务Topic:
kafka-topics.sh --create --bootstrap-server bk01:8090,bk02:8090,bk03:8090 --replication-factor 3 --partitions 6 --topic custom_order 启动进程,模拟生产者持续发送数据(25000TPS,每条消息1KB):
nohup kafka-producer-perf-test.sh --topic custom_order --num-records 20000000 --record-size 1024 --throughput 25000 --producer-props bootstrap.servers bk01:8090,bk02:8090,bk03:8090 > producer.log 2>&1 & 启动进程,模拟消费者持续消费数据:
nohup kafka-consumer-perf-test.sh --topic custom_order --group consumer-group1 --messages 20000000 --show-detailed-stats --bootstrap-server bk01:8090,bk02:8090,bk03:8090 > consumer.log 2>&1 & 等待一定时间,直到Kafka自身的监控指标和业务应用指标达到稳定状态。在此期间,记录各项监控指标的基线数值。
演练执行
回到演练管理界面,找到刚刚创建的演练任务配置,点击右侧的执行演练->发起新演练任务,填写任务的名称和描述,点击确定发起一次演练任务。
点击任务名称或者右侧的详情,进入演练执行界面,在动作列表栏目点击执行,发起故障动作注入。
点击故障注入的节点,在右侧弹出的页面点击查看日志,查询本次故障注入的执行细节。
演练观察
在演练执行界面点击监控指标,查看Kafka实例节点所在机器的监控指标变化。为了更细粒度观察故障注入的影响,可登录分布式消息服务Kafka控制台查看详细的指标。
观察生产流量指标,业务数据产生期间,生产流量持续存在,故障注入期间无明显波动。
观察生产请求平均处理时长指标,故障注入期间存在明显波动,表明Kafka Broker在CPU高负载下处理生产请求的效率下降,可能导致生产者写入耗时增加。
观察CPU使用率指标,故障注入期间维持在高位。
查看压测工具生产者的日志,故障注入前生产者发送一批消息的平均延迟<1ms,故障注入期间延迟大幅度增加,且波动明显,故障恢复后延迟水平恢复正常。
查看压测工具消费者的日志,故障注入期间消费速度出现了明显波动,但没有出现消息积压。