RabbitMQ 消息队列

RabbitMQ

Posted by alovn on March 23, 2019

概念

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

测试脚本