去年双十一大促期间,我们电商平台的订单消息系统遭遇了严重的消息堆积问题。RocketMQ集群中单个Topic的消息积压量一度突破300万条,消费者延迟达到惊人的8小时。作为核心系统的负责人,我不得不连夜组织应急处理。
这种量级的消息堆积会导致一系列连锁反应:
通过监控数据发现,消费者组的TPS(每秒处理事务数)峰值仅为200,而生产者端的消息发送速率高达5000TPS。主要瓶颈在于:
RocketMQ控制台显示,16个队列中有3个队列的消息堆积量占总堆积量的70%。这是由于:
java复制// 优化后的消费者配置示例
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("order_consumer_group");
consumer.setConsumeThreadMin(32); // 最小线程数
consumer.setConsumeThreadMax(64); // 最大线程数
consumer.setPullBatchSize(32); // 每次拉取消息数
consumer.setConsumeMessageBatchMaxSize(10); // 批量消费消息数
关键优化点:
通过修改消费组配置实现更合理的队列分配:
bash复制# 开启消费位点自动平衡
sh mqadmin updateSubGroup -n namesrv:9876 -g order_consumer_group -c true
同时采取的措施:
对于已堆积的消息,我们实施了特殊处理流程:
python复制# 消息导出脚本示例
def export_messages():
consumer = Consumer(group_id='temp_group')
consumer.subscribe(['order_topic'])
with open('/data/backup/messages.txt', 'w') as f:
while True:
messages = consumer.poll(timeout_ms=1000)
for msg in messages:
f.write(msg.value() + '\n')
在生产者端增加自适应限流:
java复制// 令牌桶限流实现
RateLimiter limiter = RateLimiter.create(5000); // 5000TPS
public void sendMessage(Message msg) {
limiter.acquire();
producer.send(msg);
}
我们建立了完整的监控看板,跟踪以下核心指标:
| 指标名称 | 告警阈值 | 监控频率 |
|---|---|---|
| 消息堆积量 | >10万 | 10秒 |
| 消费延迟 | >30秒 | 10秒 |
| 消费者线程使用率 | >80% | 30秒 |
| 网络IO | >50MB/s | 60秒 |
通过Prometheus + AlertManager实现多级预警:
基于K8s的HPA实现消费者自动扩缩容:
yaml复制apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: rocketmq-consumer
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-consumer
minReplicas: 4
maxReplicas: 20
metrics:
- type: External
external:
metric:
name: rocketmq_message_backlog
target:
type: AverageValue
averageValue: 5000
新增消息TTL机制和死信队列:
java复制Message message = new Message();
message.setTopic("order_topic");
message.setBody(content.getBytes());
message.setDelayTimeLevel(3); // 延迟级别
message.putUserProperty("TTL", "3600000"); // 1小时过期
线程池配置需要根据消息处理耗时动态调整,我们发现CPU密集型任务适合较小线程数,而IO密集型任务需要更大线程池
批量消费的大小需要平衡吞吐量和故障恢复成本,建议控制在5-20条/批
监控指标需要包含消费进度、线程状态、系统资源三位一体的数据
应急方案必须提前演练,我们通过ChaosBlade定期模拟消息堆积场景
这次事件后,我们建立了消息中间件SLA标准:99.9%的消息延迟控制在10秒内,系统最大可承受消息堆积量提升至500万条。关键是要建立从预防到应急的完整体系,而不是单纯解决眼前的问题。