概念
RabbitMQ 是一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。RabbitMQ使用的是AMQP协议,它是一种二进制协议。默认启动端口 5672。
AMQP 核心概念
Broker: 简单来说就是消息队列服务器
Virtual Host: 虚拟机,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,通一个Virtual Host里面不能有相同名称的Exchange或Queue.
Exchange: 消息交换机,接收消息,根据路由键转发消息到绑定队列。
Queue: 也称为 Message Queue, 消息队列,用来保存消息直到发送给消费者,每个消息都会被投入到一个或多个队列。
Binding: 绑定器,Exchange 和 Queue之间的虚拟连接, 它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key: 一个路由规则,交换机可用它来确定如何路由一个消息。
Channel: 多路复用连接中的一条独立的双向数据流通道,为会话提供物理传输介质,在客户端的每个连接里,可建立多个channel
Consumer: 消费者
Producer: 生产者
RabbitMQ 消息是如何流转的?
1
Producer Application ---> Message ---> Exchange --> MessageQueue ---> Consumer Application
RabbitMQ Exchange 类型
- direct
- fanout
- topic
- headers
Directed Exchange
路由键exchange,该交换机收到消息后会把消息发送到指定routing-key的queue中。那消息交换机是怎么知道的呢?其实,producer deliver消息的时候会把routing-key add到 message header中。routing-key只是一个messgae的attribute。direct是rabbitmq内部默认的一个交换机。该交换机的name是空字符串,所有queue都默认binding 到该交换机上。所有binding到该交换机上的queue,routing-key都和queue的name一样。
Fanout Exchange
扇形交换机,该交换机会把消息发送到所有binding到该交换机上的queue。这种是publisher/subcribe模式。用来做广播最好。 所有该exchagne上指定的routing-key都会被ignore掉。
Topic Exchange
通配符交换机,exchange会把消息发送到一个或者多个满足通配符规则的routing-key的queue。其中表号匹配一个word,#匹配多个word和路径,路径之间通过.隔开。如满足a..c的routing-key有a.hello.c;满足#.hello的routing-key有a.b.c.helo。 支持的两个通配符:
- *代表一个词
- #代表零或多个词
Header Exchange
设置header attribute参数类型的交换机。相较于 direct 和 topic 固定地使用 routing_key , headers 则是一个自定义匹配规则的类型.
在队列与交换器绑定时, 会设定一组键值对规则, 消息中也包括一组键值对( headers 属性), 当这些键值对有一对, 或全部匹配时, 消息被投送到对应队列.
绑定时, 通过 arguments 参数设定匹配规则, x-match 是一个特殊的规则, 表示需要全部匹配上, 还是只匹配一条:
- all: 全部匹配
- any: 只匹配一个
关于默认 Exchange
默认的 exchange 是一个由 broker 预创建的匿名的(即名字是空字符串) direct exchagne. 对于简单的程序来说, 默认的 exchange 有一个实用的属性: 如果没有显示地绑定 Exchnge, 那么创建的每个 queue 都会自动绑定到这个默认的 exchagne 中, 并且此时这个 queue 的 route key 就是这个queue 的名字.
安装启动
1
2
3
yum install rabbitmq
rabbitmq-plugins enable rabbitmq_management //启用webui管理, 端口默认 15672
service rabbitmq-server restart