1.如何保证消息不被重复消费?
从broker和消费者来说:(这个不好用)
消费者消费消息后可以发送一个ack给broker,此时broker就能知道消息已消费,但是如果ack并不能传输到broker中(比如消费者消费完消息之后宕机了),此时就无法保证消息不被重复消费。
从消息的消费者来说可以通过保证幂等性:(从应用的角度)
总共有三种思路:
- 利用redis的set的天然幂等性
- 利用全局唯一的id,如uuid,雪花算法等,与消息进行绑定;
- 利用数据库的唯一键,比如主键,unique键。

2.why消息队列?(适用场景,本身特点)


不用消息队列的情况下,A服务和B服务之间直接进行通信,会有很强的耦合性,很多处理逻辑都要A和B来完成;
使用消息队列的情况下,A和B之间通过消息队列进行通信,耦合性降低,同理消息队列也可以减轻A和B的一些逻辑处理压力,一个只管发送消息,一个只管消费消息。
同时在异步的情况下,不需要同步等待,从而可以提高系统性能。
流量突增的情况下,比如A调用B,B承受不了这么大的请求就会垮掉。(比如数据库访问)。在使用消息队列的情况下可以将大量请求缓存在消息队列中,然后再由消费者慢慢地消费。
