官方文档地址:https://www.rabbitmq.com/getstarted.html
工作模式其实就是消息队列分发消息的路由方式。
RabbitMQ常用的几种工作模式:
请求/应答模式(Request/Reply):在这种模式下,客户端发送一个请求消息到队列中,然后一个或多个消费者处理该请求并发送响应消息回复给客户端。这种模式常用于需要客户端与服务端之间进行双向通信的场景,例如RPC(远程过程调用)。
确认模式(Acknowledgements):RabbitMQ支持消息的确认机制。当消费者从队列中获取消息并成功处理后,会向RabbitMQ发送一个确认消息。这样可以确保消息被正确处理,避免消息丢失。
延迟队列模式(Delay Queues):延迟队列模式用于延迟处理消息。消息被发送到延迟队列,等待一段时间后再被转发到目标队列进行处理。这种模式可以用于实现定时任务、延迟通知等功能。
死信队列模式(Dead-Letter Queues):当消息无法被消费或被拒绝时,可以将其发送到死信队列。死信队列通常用于处理无法被处理的消息,以便进一步分析和处理。
简单模式最容易理解,一个生产者一个消费者,生产者产生数据写入MQ消息队列,消费者从MQ中读取消息数据进行处理。
WorkQueues工作队列模式由多个消费端组成,与简单模式相比,多了一个或者一组消费端,多个消费端共同消费同一个队列中的消息数据,但是多个消费端会抢着读取队列中的一条消息数据。
多个消费者消费数据的方式是轮询。
一个队列中如果存在多个消费者,那么消费者之间对于同一个消息的关系是竞争关系,只有一个消费端去处理这一条消息数据,争前恐后去抢一条数据进行处理,因此说是竞争关系。
应用场景:对于任务过重或者任务较多的情况下,工作队列模式可以提供任务的处理速度,因为是多个消费端同时处理消息数据,例如短发分发,只需要有一个消费端成功发送即可。
在前面的两种模式中,一个消费方只能处理一个消息数据,效率并不高,从而引来了Pub/Sub发布订阅模式,发布订阅模式中的多个消费者可以同时对一条消息数据进行处理。
如下图所示,在发布订阅模式中多了一个组件,这个组件就是Exchange交换组件,生产者发布数据到MQ消息队列,首先会进入到Exchange交换组件,由Exchange将消息数据路由分发到不同的队列中,然后消费者同时从不同的队列中消费数据。
Exchange可以看似将一条消息数据拆分成了多个内容,然后分别存放在不同的队列中,这样多个消费者就可以在不同的队列中同时消费数据。
P:生产者,发送消息的程序,不会直接发送到消息队列,而是先发送给X(交换机)。
C:消费者,消息的接收者,一直等待消息数据的到来。
Queue:消息队列,接收消息、缓存消息、
Exchange:交换机,接收生产者发送的消息,将消息传递给某个特别队列、传递给所有队列、或者将消息丢弃,如何操作就要取决于Exchange的类型。
常见的Exchange交换机类型:
Exchange只负责转发消息,不具备存储消息的能力,如果没有队列与Exchange绑定,那么消息就会丢失。
Routing是Exchange中的一种类型,使用Routing路由模式,可以将不同级别的消息数据路由到特定的消息队列中,再由特定的消费者进行接收处理。
Routing的应用场景举例:将error级别的消息数据通过A消费者写入到数据,其他级别的消息数据通过B程序展示在控制台。
使用Routing路由模式时,Exchange与队列也不再进行绑定了,而是通过声明一个RoutingKey,通过这个key将消息路由到特定的队列中,因此在消息发送方发消息时,就需要指定消息的RoutingKey,Routing根据消息中的RoutingKey进行判断,当消息中的RoutingKey与队列中的RoutingKey完全一致时,消息才能正常存储到队列中,最后被消费者处理。
Topics模式是功能最强大的一个模式,具备上述所有模式的功能。
Topics是Exchange中的一种类型,当指定模式为Topic时,消息数据的路由就支持了通配符的形式,例如当消息发送方发送的数据中,RouteingKey包含orange的消息数据都被路由到Q1队列中,消息的RouteingKey包含rabbit的数据被路由到Q2队列中。当一个RouteingKey同时满足两个队列的条件时,会将消息同时分发到两个队列中。
简而言之,使用Topic模式后,可以对消息数据中的RoutingKey进行通配符匹配,将满足条件的消息数据分发到特定的队列中。