RabbitMQ 介绍

jasmine 于 2021-12-06 发布

什么是消息队列

“消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。

消息队列优缺点

优点:

缺点:

RabbitMQ特点

衡量一个MQ的指标,主要有三个方面:服务性能、数据存储、集群架构

RabbitMQ AMQP协议模型

AMQP协议模型

AMQP协议基本概念

Connection

Connection

RabbitMQ 基本概念

RabbitMQ 消息结构

# publishInfo
exchange: amq.direct
immediate: false
mandatory: false
routingKey: test

# headerBody
bodySize: 1024
properties: 
    - contentType: 
    - encoding: 
    - deliveryMode: 
    - priority: 
    - correlationId: 
    - replyTo: 
    - expiration: 
    - messageId: 
    - timestamp: 
    - type: 
    - userId: 
    - appId: 
    - clusterId: 
    - headers: {}

# contentBody
二进制消息体bytes

每个消息分为三个部分,在网络层面即三个独立数据帧:

RabbitMQ 工作模式

1、 direct。消息的routing key需要精确匹配binding key。 Connection

当生产者(P)发送的消息Rotuing key=booking时,发现Queue1和Queue2都符合,就会将消息传送给这两个队列,如果以Rotuing key=create或Rotuing key=confirm发送消息时,这时消息只会被推送到Queue2队列中,其他Routing Key的消息将会被丢弃。

注意RabbitMQ有一个默认Exchange,类型是direct,没有办法绑定一个queue到这个exchange,但是通过指定routing key,可以发送消息到同名的queue。

2、 fanout。这个类型的exchange会发送消息到所有绑定在上面的queue,routing key和binding key不起作用。

Connection

生产者(P)生产消息1将消息1推送到Exchange,Exchange将消息推送到所有与它绑定Queue,最后两个消费者都会收到消息。

3、topic。Binding key可以使用*和#来对routing key进行模糊匹配。

点号“. ”分隔的每一段字符串称为一个单词,如“quick.orange.rabbit”包含3个单词quick,orange,rabbit。点分割的部分可以为空,比如bindingkey=.的可以匹配routingkey是”.”的消息,但是bindingkey=“”无法匹配routingkey是空的消息。可以简单理解,先将routingkey按照stringsplit方法用”.”分割,保留空白字符,表示匹配分割后的一个位置,#表示匹配0…n个位置。其余字符需要精确匹配。 表示一个单词,#表示0或多个单词。 binding key使用“”与“#”来模糊匹配routing key。routing key中的“*”或“#”当做普通字符处理。

Connection

当生产者发送消息Routing Key=F.C.E时,只会被路由到Queue1中,如果Routing Key=A.C.E这时候会被同时路由到Queue1和Queue2中,如果Routing Key=A.F.B时,这里只会发送一条消息到Queue2中

Will “*” binding catch a message sent with an empty routing key? 不会

Will “#.*” catch a message with a string “..” as a key? Will it catch a message with a single word key? 都会

How different is “a.*.#” from “a.#”? 前者routingkey要有”a.”,后者只要有”a”就能匹配。

  1. headers。headers交换器允许你匹配AMQP消息的header而非路由键,除此之外,和direct交换器完全一样,但是性能会差很多, 因此并不太实用,而且几乎再也用不到了。使用方法:在绑定的时候提供一组键值对,如果消息的header(也是一组键值对)和其完全匹配,则路由消息到队列。