可靠性
生产者保证本地事务和消息发送是一个事务中的。可通过事务消息完成。
生产者confirm方法,成功就ok,失败就放到重试队列里面重试。
MQ,exchange持久化,queue持久化,消息持久化。
消费者,手动ack。
不重复消费
尽量保证生产者不重复投递
消费者保证不重复消费。可以放redis中,能取到值就是消费过了,没取到就是没消费过。
顺序消费
比较统一的做法,单一消费者。缺点就是并发度比较高时候,效率比较低。
顺序消费和多线程就是矛盾关系,因为并发就是不在乎顺序,而你又在乎顺序了。
只能把需要保证顺序的放一块就ok了。
比如10个消息,3个需要有序,7个需要有序。可以用两个队列并行消费3个和7个。如果要10个都有序那就只能一个个来了。
将需要保证顺序的进行hash,放到一组,给同一个work处理就行了。
延迟消息
方式1、死信队列,需要保证消息延迟时间都是一致的。比如一个5分钟,一个10分钟。10分钟的在前面,等10分钟的出去了,5分钟的才能出去。这种就不满足业务了。
方式2、本地存库,轮询重新发送一次消息。性能有损耗,但是比较灵活。
堆积
一般都是消费者消费的慢,要么消费的出问题了,导致nack的比较多。
1、通过增加消费者,或者把消费过程改成异步,或者多线程。
2、将当前业务的topic,改成新的topic,然后多搞几个消费者消费在新的topic上。保证后续业务的正常执行,前面堆积的消息多开一些消费者进行消费。
3、增加消费者还需要设置qos,保护消费者。