为什么要使用消息队列
通过 MQ 实现的松耦合架构设计可以提高系统可用性以及可扩展性。
具体:
- 系统间解耦
- 异步处理
- 削峰填谷
- 冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
幂等
-
概念:若某个操作执行一次所产生的影响和执行多次所产生的影响是相同的,则我们认为这个操作具有幂等性。
- 必要性:在分布式系统中,消息可能会被重复消费。
- 举例:
- 某个消息部分消费失败后,希望重新消费,
- 消费者已经接收到消息并且完成了相应的业务处理,接着消费者给服务端发送确认信息,就在消费者发送确认信息时网络突然断掉,为了保证消息至少被消费一次,MQ服务端会在网络恢复后再次投递之前被消费过的消息(虽然MQ服务器并没有收到该消息被消费的反馈,但是该消息事实上已经被消费了),这样就会导致该消息被消费两次。
- 保证消费消息的幂等性:
- 业务幂等,通过具体的业务校验来实现消费逻辑的幂等。
- 消息中添加全局唯一的key,消费时根据全局唯一的key来判断消息是否为重复消息。
死信队列
-
概念:由于某些原因消息无法被正确的投递,为了确保消息不会被无故的丢弃,一般将其置于一个特殊角色的队列,这个队列一般称之为死信队列。
回退队列
重试队列
- 概念:重试队列其实可以看成是一种回退队列,具体指消费端消费消息失败时,为防止消息无故丢失而重新将消息回滚到Broker中。与回退队列不同的是重试队列一般分成多个重试等级,每个重试等级一般也会设置重新投递延时,重试次数越多投递延时就越大。