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

2.1 生产者发送消息到MQ
- 同步发送,发送后获取发送结果,发送失败后MQ会自动进行重试。
- 发消息之前先记录到消息表中,当生产者发送多次失败重试后,后面通过定时任务进行再一轮重试。
2.2 Broker收到消息不丢失
- 使用集群保证可用性
- 当消息写入到master后还未同步到slave时宕机,可以设置同步刷盘实时写入磁盘
2.3 消费者消费消息不丢失
消费者在消费成功时返回消费成功的标记,返回失败的标记后会把消息重新放入到队列中再次尝试消费。
2.4 整个MQ集群挂了,如何不丢失消息
整个集群挂了,先将消息写到一个临时存储的地方如Redis,然后等集群恢复了,将Redis中的消息转发到MQ上。
三:如何保证顺序性
- Producer将一组有序的消息写入到同一个MessageQueue中。
- Consumer每次集中从一个MessageQueue中拿取消息。
四:如何保证消息幂等性
- 通过本地的消息表手动查库去看状态。
- 每处理一次都放入到redis的布隆过滤器中进行处理。
五:如何快速处理积压的消息
一些业务需要及时的消费,长期积压的数据在超过有效期会被清除,也会导致mq性能下降。
- 增加消费者消费者线程数。
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer();
// 设置每个消费者实例消费的最大线程数
consumer.setConsumeThreadMax(64);
consumer.setConsumeThreadMin(20);
- 收到消息后异步处理业务,比如放到线程池中去处理。
- 临时扩容,收到消息后不处理,先写入到redis中,再从redis中消费,将问题转移
- 将消费模式由原来的顺序消费MessageListenerOrderly改为并行消费MessageListenerConcurrently
- 根据tag过滤,优先处理比较重要的消息。
- 服务器临时扩容增加消费者数量。
1574

被折叠的 条评论
为什么被折叠?



