这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
RabbitMQ 的概念
RabbitMQ模式
- 基础模式:一个生产者对应一个消费者
-
工作队列模式:多个消费者竞争消费
-
发布/订阅模式:一个消息可以被多个消费者同时消费
-
路由模式:通过路由选择性接收消息
-
主题模式:基于主题接收消息
-
RPC模式:发出请求,接收响应
四大核心概念
生产者
生产数据,将数据发送至MQ队列中的程序就是生产者。
交换机
RabbitMQ非常重要的一个部件,他可以接收生产者发送的数据,将其推送到队列中。交换机必须确切地知道接收到的消息需要如何处理,才能决定后续的推送方式,类型有如下几种:
-
直连交换机(Direct exchange):一个队列和一个交换机绑定,通过
routing_key进行关联。消息发送时指定一个binding_key,在交换机接收到时,会转发到指定的队列中。 -
扇形交换机(Fanout exchange):广播消息,将消息发送给所有绑定在自己身上的队列。
-
主题交换机(Topic exchange):由于直连交换机在需要发送消息给多个队列的场景使用起来非常繁琐,所以
RabbitMQ提供了一种主题交换机,生产者发送消息时携带指定的规则,主题交换机根据这个规则将数据发送到对应的多个队列上。 -
头交换机(Headers exchange):类似于
HTTP的headers,路由器和交换机路由的规则是通过headers信息来交换的。
队列
RabbitMQ内部使用的数据结构,生产者发送的消息会保存在队列中,消费者可以尝试从队列接收数据。
消费者
消费数据,监听MQ,等待接收消息的程序。
名词
AMQP
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
Message acknowledgment
message ackonwledgment 即消息回执,消费者在消费完消息后发送一个回执给RabbitMQ,RabbtiMQ收到回执后才将消息从队列中删除,如果没有收到回执并检测到消费者的RabbitMQ连接断开,那么会将该消息发送给其他消费者进行处理。
Message durability
消息持久化,即RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将队列与Message都设置为(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。
Prefetch count
消费者在开启acknowledge的情况下,对接收到的消息可以根据业务的需要异步对消息进行确认,prefetch允许为每个consumer指定最大的unacked messages数目。例如:设置prefetchCount=10,则队列每次给每个消费者(假设一共2个AB)发送10条消息,消费者无需马上回应,消费者将10条消息缓存本地客户端;当一个消费者处理完1条消息后队列会再给该消费者发送一条消息。如果两个消费者都没有回复任何一条ack,则queue就不会继续发送消息。
Exchange
交换机,生产者将消息发送到交换机,由交换机将消息根据指定的规则路由到一个或多个队列中(或者丢弃)。
RoutingKey
routingKey针对生产者而言,发送消息时一般需要指定routingkey,而这个routing key需要与Exchange Type及binding key联合使用才能最终生效。
Binding
Binding 将交换机与队列关联起来,这样RabbitMQ就知道如何正确地将消息路由到指定的队列了。
BindingKey
在绑定交换机与队列的同时,一般会指定一个binding key;生产者将消息发送给交换机时,一般会指定一个routing key;当binding key与routing key一致,或者符合模式匹配,消息就会被路由到对应的队列中。在绑定多个队列到同一个交换机的时候,这些Binding允许使用相同的binding key。binding key 并不是在所有情况下都生效,它依赖于Exchange Type,比如fanout类型的交换机就会无视binding key,而是将消息路由到所有绑定到该交换机的队列。
Exchange Types
RabbitMQ常用的Exchange Type有fanout、direct、topic、headers这四种。
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!