AMQP协议
AMQP(advanced message queuing protocol)是一种协议
,全称为 “高级消息队列协议”。更多信息请自行百度。
上图也可以充分展示 RabbitMQ
的工作模型,依据该图有助有理解RabbitMQ的核心工作组件;其中,每个 RabbitMQ
消息服务代理至少有一个 Virtual host虚拟主机
(默认/
),每个 Virtual host虚拟主机
中的 Exchange交换机、Queue队列以及Exchange交换机与Queue队列之间的绑定BindingKey
都是隔离相互独立。
Producer(生产者)和Consumer(消费者)通过与RabbitMQ服务
建立 Connection
来保持TCP长连接
,然后在 Connection
的基础上建立若干Channel
信道,用来发送与接收消息。
Connection(连接)
不管是 Producer(生产者)
还是 Consumer(消费者)
,生产者要想发送消息给Exchange或者消费者想从Queue中消费消息,首先就要与RabbitMQ服务
建立连接,这个连接就是 Connection
。Connection
是一个TCP长连接
Channel(信道)
Channel
可以实现线程间隔离
Channel
是在 Connection
的基础上建立的虚拟连接
,RabbitMQ
中大部分的操作都是使用 Channel
完成的,比如:声明Queue、声明Exchange、发布消息、消费消息
等。
此时是否有这样一个疑问:既然已经有了Connection
,完全可以使用Connection
完成Channel
的工作,为什么还要引入Channel
这样一个虚拟连接的概念呢?因为现在的程序都是支持多线程的,如果没有Channel
,那么每个线程在访问RabbitMQ服务
时都要建立一个Connection
这样的TCP连接,对于操作系统来说,建立和销毁TCP连接是非常大的开销,在系统访问流量高峰时,会严重影响系统性能。
Channel
就是为了解决这种问题,通常情况下,每个线程创建单独的Channel
进行通讯,每个Channel都有自己的 channel id 帮助Broker和客户端识别Channel,所以Channel之间是完全隔离的
。
Connection
与Channel
之间的关系可以使用光纤电缆比喻,如果把Connection
比作一条光纤电缆,那么Channel
就相当于是电缆中的一束光纤
Virtual Host(虚拟主机)
- 对于数据库而言;不同的项目应用会使用独立的库进行数据存储;同理,针对不同的项目应用可以定义不同的
Virtual host虚拟主机
。即Virtual host虚拟主机
可以用来隔离不同的应用程序Virtual host虚拟主机
需要和User用户
进行绑定,主要是用户权限隔离
Virtual host
是虚拟主机,一个Broker
中可以有多个Virtual host
,每个Virtual host
都有一套自己的Exchange
和Queue
,同一个Virtual host
中的Exchange
和Queue
不能重名,不同的Virtual host
中的Exchange
和Queue
名字可以一样。这样,不同的用户在访问同一个RabbitMQ Broker
时,可以创建自己单独的Virtual host
,然后在自己的Virtual host
中创建Exchange
和Queue
,很好地做到了不同用户之间相互隔离的效果。
Exchange(交换机)
Exchange
是一个比较重要的概念,它是消息到达RabbitMQ服务
的第一站(也可以说,消息就是发送给指定的Exchange,Exchange根据RoutingKey和BindingKey进行匹配路由消息给对应的Queue),主要负责根据不同的分发规则将消息分发到不同的Queue
,供订阅了相关Queue
的消费者消费到指定的消息。那Exchange
有哪些分发消息的规则呢?这就要说到Exchange
的4种类型了:direct、fanout、topic、headers
。
- direct和headers对应点对点模式;其中headers类型不太常用。
- fanout和topic对应发布订阅模式; fanout类型就是广播;topic就是更加细致的发布订阅
RoutingKey|BindingKey
RoutingKey
,翻译成中文就是路由键。当我们创建好Exchange
和Queue
之后,需要使用Routing key(通常叫作Binding key)
将它们绑定起来。Producer
在向Exchange
发送一条消息的时候,必须指定一个Routing key
,然后Exchange
接收到这条消息之后,会解析Routing key
,然后根据Exchange
和Queue
的绑定规则,将消息分发到符合规则的Queue
中。
Queue(队列)
Queue
是一个用来存放消息的队列,生产者发送给Exchange的消息最终都会被路由到对应Queue
中,消费者消费消息时是直接从Queue
中取走消息
参数 | 作用 |
---|---|
x-message-ttl | 发送到队列的消息在丢弃之前可以存活时间(毫秒) |
x-max-length | 队列最大长度 |
x-expires | 队列在被自动删除(毫秒)之前可以使用多长时间 |
x-max-length-bytes | 消息容量限制,该参数是非负整数值。该参数和x-max-length目的一样限制队列的容量,但是这个是靠队列大小(bytes)来达到限制。 |
x-dead-letter-exchange | 设置队列溢出行为。这决定了在达到队列的最大长度时消息会发生什么。有效值为drop-head或reject-publish。交换的可选名称,如果消息被拒绝或过期,将重新发布这些名称 |
x-dead-letter-routing-key | 可选的替换路由密钥,用于在消息以字母为单位时使用。如果未设置,叫使用消息的原始路由密钥 |
x-max-priority | 队列支持的最大优先级数;如果未设置,队列将不支持消息优先级 |
x-queue-mode | 将队列设置为延迟模式,在磁盘上保留尽可能多的消息以减少内存使用,如果未设置,队列将保留内存缓存以尽快传递消息 |
x-queue-master-locator | 将队列设置为主位置模式,确定在节点集群上声明时队列主机所在的规则 |