5.如何避免消息重复投递或重复消费?
在消息生产时,MQ 内部针对每条生产者发送的消息生成一个 inner-msg-id,作
为去重的依据(消息投递失败并重传),避免重复的消息进入队列;
在消息消费时,要求消息体中必须要有一个 bizId(对于同一业务全局唯一,如支
付 ID、订单 ID、帖子 ID 等)作为去重的依据,避免同一条消息被重复消费。
6、消息基于什么传输?
由于 TCP 连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶
颈。RabbitMQ 使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的
虚拟连接,且每条 TCP 连接上的信道数量没有限制。
7、消息如何分发?
若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消
费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息
并进行确认)。
通过路由可实现多消费的功能
8、消息怎么路由?
消息提供方->路由->一至多个队列
消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设
定。
通过队列路由键,可以把队列绑定到交换器上。
消息到达交换器后,RabbitMQ 会将消息的路由键与队列的路由键进行匹配(针
对不同的交换器有不同的路由规则);
常用的交换器主要分为一下三种
fanout:如果交换器收到消息,将会广播到所有绑定的队列上
direct:如果路由键完全匹配,消息就被投递到相应的队列
topic:可以使来自不同源头的消息能够到达同一个队列。 使用 topic 交换器时,
可以使用通配符