【消息分发】
- 如果一个队列中有多个消费者订阅,那么消息的发送将会以轮询调度算法(Round Robin)的方式发送给消费者。
- 如果消费者可正常的处理消息的话,每条消息只会发送给一个订阅的消费者。
- 可以通过路由的方式,实现多消费的功能。
【消息路由】
- Producer将消息发送到交换器时,消息将拥有一个路由key(routing key),是在消息创建的时候设置的。
- 通过routing key,可以把队列绑定到交换器上。
- 消息到达交换器之后,针对不同交换器的不同路由规则,RabbitMQ会将消息的routing key与队列的routing key进行匹配。
- 常用的交换器主要分为以下三种:
- fanout 如果交换器收到消息,将会广播到所有绑定的队列上。
- direct 如果路由键完全匹配,消息就被投递到相应的队列上。
- topic 可以使来自不同来源的消息到达同一个队列。 使用topic交换器的时候,是支持使用通配符的。
【消息持久化】
- 如果RabbitMQ发生了服务器重启,那么如何保证数据不丢失呢?处理的方式是,将消息写入到磁盘上的一个持久化日志文件中,当一条消息发送到交换器上的时候,会在消息提交到日志文件之后才发送响应。一旦消费者从持久队列中消费了一条持久化的消息后,RabbitMQ会在持久化日志中把这条消息标记为等待垃圾收集的状态。如果持久化消息在被消费之前发生了RabbitMQ服务器重启,那么它会自动重建交换器和队列,并重新发布持久化日志文件中的消息到合适的队列中。