RocketMQ常见问题
rocketmq常见问题
消息丢失
出现消息丢失可能会有三种情况
-
Producer端
-
Broker端
-
Consumer端
Producer保证消息不丢失
-
检查网络延时,如果是网络延迟高,延长收到确认结果的超时时间,默认超时是3秒
-
rocketMQTemplate.getProducer().setSendMsgTimeout(5000);
-
采用同步发送,保证每次发送的消息结果都是正常的
SendResult sendResult1 = rocketMQTemplate.syncSend("base_topic", text1);
-
添加重试次数,默认是3次
//设置同步发送失败后的重试次数为5,4在底层会+1,默认3次 rocketMQTemplate.getProducer().setRetryTimesWhenSendFailed(4);
Broker端保证消息不丢失
-
修改刷盘策略为同步策略,默认情况是异步刷盘
flushDiskType = SYNC_FLUSH
-
集群部署,主从模式,高可用
Consumer端如何保证消息不丢失
- 完全消费后进行手动确认
消息重复消费
- 保证消费消息的幂等性(多次调用和一次调用的效果相同)
- 维护一个消费记录,例如在在消费过程中添加一个唯一ID,在每次消费前都先查询这个消息是否被消费过
消息堆积
消息堆积的主要瓶颈在于消费者的消费能力,消费能力由消费耗时和消费并发度决定的
消费耗时,可能出现的情况有业务代码中出现了死循环,大量递归,调用下游系统出现了异常而没有处理
消费并发度由单节点线程数和节点数量共同决定,其值为单线程数数*节点数,可以调节线程数来提高消费并发度
- 同一个 ConsumerGroup 下,通过增加 Consumer 实例数量来提高并行度(需要注意的是超过订阅队列数的 Consumer 实例无效)。可以通过加机器,或者在已有机器启动多个进程的方式。
- 提高单个 Consumer 的消费并行线程,通过修改参数 consumeThreadNumber、consumeThreadMax实现。
消费者线程数默认为20,最大为65
设置线程数为30
@RocketMQMessageListener( topic = "base_topic",consumerGroup = "defaultGroup", messageModel = MessageModel.BROADCASTING, consumeMode= ConsumeMode.CONCURRENTLY,consumeThreadNumber = 30)
使用批量方式消费提高消费能力
通过设置 consumer的 consumeMessageBatchMaxSize 返个参数,默认是 1,即一次只消费一条消息,例如设置为 10,那么每次消费的消息数小于等于 10。
public class MessageLose implements RocketmqCommonProblemService, RocketMQListener<String>, RocketMQPushConsumerLifecycleListener {
@Resource
private RocketMQTemplate rocketMQTemplate;
@Override
public void prepareStart(DefaultMQPushConsumer consumer) {
//设置批量消费消息的最大次数为10,默认是1
consumer.setConsumeMessageBatchMaxSize(10);
}
}
丢弃非重要的消息
优化每条消息的消费过程
本文作者:码云逸栈
本文链接:https://www.cnblogs.com/chuan2/p/17069562.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY