一、生产者端
1.比如遇到各种流量冲击的活动:618、双11大促、竞拍、抢购、秒杀业务。(这种需要做好容量预估管理)
2.程序缺陷;死循环调用、批量请求、内存泄漏导致的流量飙升问题。(这种需要做好)
二、消费者端
1.消费失败时大量重试导致消息堆积
2.消费者程序的故障:如 程序死锁,io阻塞等。
三、解决方案
1.通过增加消费者的数量来提升消息的处理能力。增加消费者可以分担消息消费的负载,缓解消息队列的堆积问题。
2.提高单个消费者的消费并行线程。RocketMQ 支持批量消费消息,可以通过修改DefaultMQPushConsumer 消费者类的consumeThreadMin(最少消费线程数),以及consumeThreadMax(最大消费线程数)来提高单个消费者的消费能力。
①监听器代码
package com.powernode.yktest;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
import java.sql.SQLOutput;
/**
* @description:
* @author: 袁凯
* @time: 2024/4/11 11:52
*/
@Component
@RocketMQMessageListener(topic = "boot-simple", consumerGroup = "powernode-group",consumeMode = ConsumeMode.ORDERLY)
public class SimpleMsgListener implements RocketMQListener<MessageExt> {
private long totalConsumeTime = 0; // 记录所有消息的总消费时间
private int messageCount = 0; // 记录已经消费的消息数量
private final Object lock = new Object(); // 锁对象
@Override
public void onMessage(MessageExt messageExt) {
long startTime = System.currentTimeMillis();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
long endTime = System.currentTimeMillis();
long consumeTime = endTime - startTime;
synchronized (lock) {
// 累加消费时间和消息数量
totalConsumeTime += consumeTime;
messageCount++;
// 打印消费消息的时间戳和消费耗时
System.out.println("Message ID: " + messageExt.getMsgId() + ", Consume Time: " + consumeTime + "ms" + "messageCount:" + messageCount);
// 如果所有消息都已经消费完成,打印总的消费时间和平均消费时间
if (messageCount == 100) { // 假设总共有 100 条消息
System.out.println("Total Consume Time: " + totalConsumeTime + "ms");
System.out.println("Average Consume Time: " + totalConsumeTime / messageCount + "ms");
}
}
}
}
②顺序消费时,消耗100条1ms的消息耗费时长

③修改为并发消费
@RocketMQMessageListener(topic = "boot-simple", consumerGroup = "powernode-group", consumeThreadNumber = 3)
3.某些业务流程如果支持批量方式消费,则可以很大程度上提高消费吞吐量,例如订单扣款类应用,一次处理一个订单耗时 1 s,一次处理 10 个订单可能也只耗时 2 s,这样即可大幅度提高消费的吞吐量。建议使用5.x SDK的SimpleConsumer,每次接口调用设置批次大小,一次性拉取消费多条消息。

**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。