RocketMQ入门教程(六):最佳实践和面试题(不丢失、幂等性、消息积压)

一:最佳实践

一个应用尽可能用一个topic,而消息子类型可以用tags来表示。
tags可以由应用设置,只有生产者在发送消息设置了tags,消费方在订阅时才可以利用tags通过broker做消息过滤。message.setTags(“xxx_tag”)。
Topic过多会增加RocketMQ的元数据维护的性能消耗,所以在使用时还是需要对Topic进行合理的分配。

二:如何保证消息不丢失

在这里插入图片描述

2.1 生产者发送消息到MQ

  1. 同步发送,发送后获取发送结果,发送失败后MQ会自动进行重试。
  2. 发消息之前先记录到消息表中,当生产者发送多次失败重试后,后面通过定时任务进行再一轮重试。

2.2 Broker收到消息不丢失

  1. 使用集群保证可用性
  2. 当消息写入到master后还未同步到slave时宕机,可以设置同步刷盘实时写入磁盘

2.3 消费者消费消息不丢失

消费者在消费成功时返回消费成功的标记,返回失败的标记后会把消息重新放入到队列中再次尝试消费。

2.4 整个MQ集群挂了,如何不丢失消息

整个集群挂了,先将消息写到一个临时存储的地方如Redis,然后等集群恢复了,将Redis中的消息转发到MQ上。

三:如何保证顺序性

  1. Producer将一组有序的消息写入到同一个MessageQueue中。
  2. Consumer每次集中从一个MessageQueue中拿取消息。

四:如何保证消息幂等性

  1. 通过本地的消息表手动查库去看状态。
  2. 每处理一次都放入到redis的布隆过滤器中进行处理。

五:如何快速处理积压的消息

一些业务需要及时的消费,长期积压的数据在超过有效期会被清除,也会导致mq性能下降。

  1. 增加消费者消费者线程数。
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer();
// 设置每个消费者实例消费的最大线程数
consumer.setConsumeThreadMax(64);
consumer.setConsumeThreadMin(20);
  1. 收到消息后异步处理业务,比如放到线程池中去处理。
  2. 临时扩容,收到消息后不处理,先写入到redis中,再从redis中消费,将问题转移
  3. 将消费模式由原来的顺序消费MessageListenerOrderly改为并行消费MessageListenerConcurrently
  4. 根据tag过滤,优先处理比较重要的消息。
  5. 服务器临时扩容增加消费者数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值