作者:手机用户2502887641 | 来源:互联网 | 2023-07-28 22:10
RabbitMQArchitectureRabbitMQ概念AMQP全名AdvancedMessageQueuingProtocol即高级消息队列协议,是应用层协议的一个开放标准,
RabbitMQ Architecture
RabbitMQ概念
AMQP
全名 Advanced Message Queuing Protocol即高级消息队列协议,是应用层协议的一个开放标准,消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然
RabbitMQ是基于AMQP研发的,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等
Broker
是指一个消息队列服务器实体,集群中的一个实例节点
ConnectionFactory
是指RabbitMQ与发布者或消费者之间的Connetions,这些Connections是通过ConnectionFactory进行管理的
Connections
是指RabbitMQ与发布者与消费者之间的TCP连接,通常是一个长连接
Channel
是建立在RabbitMQ Connections中的数据传输信道,早期版本默认值是0,即不限制channel的个数,3.8版本之后默认值是2047,即每条Connection最多可以初始化2047个Channel,但是RabbitMQ官方不建议初始化过多的Channel,因为太多的Channel会消耗大量内存
无论是发布消息、消费消息、订阅队列等路由都是通过Channel完成的,可以把Channel看成一条虚拟的TCP连接,在RabbitMQ中一旦TCP建立完成,就创建channel
Exchange
负责接收消息、并根据消息中的Routing key与Exchange的binding key进行匹配,进行转发消息
Queue
消息队列,是用来存储消息,是消息的容器,消息的载体,同时也是城消息的终点
Message
消息,消息是由消息头与消息体组成的,消息体是不透明的,而消息头则由一些属性组成的(expiration过期时间、priority优先级、delivery_mode、routing key等)
Routing key
routing key是消息本身一条属性,它决定了消息如何路由到队列中,但是routing key会依赖Exchange的类型
通常我们发送一条消息时,在消息属性设置routing key属性,这个属性主要是与exchange的binding key结合使用
Binding
使用binding把Queue与Exchange关联起来,可以看作成一个link,绑定条件是需要通过binding key完成
Binding key
RabbitMQ在绑定Exchange与Queue时,通常会指定一个binding key,这个binding key主要是与接收到的消息中的routing key进行路由匹配
Exchange类型
Direct
direct类型的Exchange路由规则其实很简单,消息的生产者把消息publish到交换器时,使用消息本身的routing-key与binding key进行完全匹配
下图表示,以routingKey=”error”发送消息到Exchange,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…);如果我们以routingKey=”info”或routingKey=”warning”来发送消息,则消息只会路由到Queue2。如果我们以其他routingKey发送消息,则消息不会路由到这两个Queue中
fanout
fanout类型的exchange是这样的,消息的生产者把消息publish到交换器时,所有的消息都会路由到绑定在交换器的队列中
下图中,生产者(P)发送到Exchange(X)的所有消息都会路由到图中的两个Queue,并最终被两个消费者(C1与C2)消费
Topic
topic类型的exchange在匹配规则上了进行了扩展,与direct类型有点相似,同样使用routing key与binding key匹配,但是topic类型的exchange支持模糊匹配routing key使用句点 “." 来分隔名称,被分隔的每一段认为是一个单词,如:“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
routing key使用句点 “.” 来分隔名称,被分隔的每一段认为是一个单词,如:“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
binding key同样也是使用句点 “.” 分隔。binding key还存在一种特殊字符 “#”,这个#用来匹配被分隔的字段
如下图,routingKey=”quick.orange.rabbit”的消息会同时路由到Q1与Q2,routingKey=”lazy.orange.fox”的消息会路由到Q1与Q2,routingKey=”lazy.brown.fox”的消息会路由到Q2,routingKey=”lazy.pink.rabbit”的消息会路由到Q2(只会投递给Q2一次,虽然这个routingKey与Q2的两个bindingKey都匹配);routingKey=”quick.brown.fox”、routingKey=”orange”、routingKey=”quick.orange.male.rabbit”的消息将会被丢弃,因为它们没有匹配任何bindingKey
Header
headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配
在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue
参考文献
https://blog.csdn.net/caox_nazi/article/details/81208420
搜索
复制