rabbitmq初解
工作模式
工作队列模式
- work queues:一个生产者,一个消费队列,多个消费者,消费组之间是竞争关系,一条消息只能被其中的一个消费者进行消费。
- 应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
发布订阅模式
在发布订阅模式中,多了一个Exchange角色,过程稍微进行变化了。
- P:消息的生产者,不再把消息发送到队列中,而是发送给交换机。
- C:消息的消费者,当有消息发送到监听到的队列中时会进行消费,否则一直等待。
- Queue:消息队列,用于接收消息、缓存消息。
- Exchange:交换机。一方面接收生产者的消息,另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或将消息抛弃。具体如何操作,取决于Exchange的类型。交换机只负责转发消息,不具备存储消息的能力,如果没有与任何队列相绑定,或者没有符合路由规则的队列,那么消息会丢失。
- Fanout:广播:将消息发送给所有绑定到该交换机的队列。
- Direct:定向,将消息交给符合指定routing key的队列。
- Topic:通配符,把消息交给符合routing pattern的队列。
死信队列
DLX,死信交换器。当一个消息在队列中变成死信后,它能被重新发送到另一个交换器中,这个交换器就是DLX,绑定DLX的队列就是死信队列。
死信的原因
- 消息被拒
- 消息TTL过期了
- 队列满了,无法再添加
延迟队列
延迟队列指的是存储对应延迟消息,消息被发送后,并不想立刻让消费者拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。
RabbitMQ本身没有延迟队列,要实现有两种方式:
- 通过RabbitMQ本身队列的特性来实现,需要使用RabbitMQ的死信交换机和消息存活时间TTL,即给消息设置一个TTL,即延迟时间,当过期后会将消息投入死信交换机,然后路由到相应死信队列,消费者去死信队列拿取消息进行消费。
- RabbitMQ在3.5.7及以上版本提供了一个插件来实现延迟队列功能。
优先级队列
RabbitMQ在3.5.0后有优先级队列实现,优先级高的队列会被消费。
可以通过 x-max-priority 参数来实现优先级队列。不过当消费速度大于生产速度且broker没有堆积的情况下,优先级没有太大意义。
消息可靠性
消息可靠性,也就是消息不丢失。从三个方面:
- 生产者:从生产者到消息队列中,采用事务机制和confirm机制,当消息进入到队列后消息队列会返回是否成功,生产者根据返回信息来决定是否重试等机制。
- 消费者:从消息队列到消费者,basicAck机制,由消费者进行消费成功的ack。
- 消息队列:自身采用了持久化、集群、普通模式、镜像模式等。
消息的顺序性
- 拆分多个queue,每个队列一个消费者。
- 一个queue对应一个消费者,然后消费者内部用内存做排队,底层分发给不同的worker来处理。