RabbitMQ笔记

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,由 Erlang 语言开发
AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

生产者/消费者

生产者创建消息,然后发布到代理服务器(RabbitMQ)。

消息由2部分构成:

- payload: 有效载体,要传输的数据,可以是任务内容
- label: 标签,描述了payload,并且RabbitMQ用它来决定谁将获得消息的拷贝

消费者接受来自于RabbitMQ的消息并处理

信道(channel)

应用程序和Rabbit代理服务器之间创建一条TCP连接。一旦TCP连接打开,应用程序就可以创建一条AMQP信道。

信道是建立在“真实的”TCP连接内的虚拟连接。

AMQP命令都是通过信道发送出去的。

信道就好像电缆里的一根光纤,电缆就是AMQP连接

Note: 为什么不直接通过TCP连接发送AMQP命令呢?
主要原因在于对操作系统来说建立和销毁TCP会话是非常昂贵的开销。

队列

接受消息的两种方式:

  • basic.consume: 消费最近接收到到消息后,自动从队列接收下一条消息。
  • basic.get: 从队列获得单条消息而不是持续订阅。

队列参数:

  • auto_ack: true下,一旦消费者接收消息,Rabbitmq会自动视其确认了消息。
  • basic.reject: 设置成true,RQ会把消息发送给下一个订阅的消费者。设置成false, 死信(dead letter)
  • exclusive: 设置成true,队列将变成私有的,只有消费者。
  • auto-delete: 当最后一个消费者取消订阅的时候,队列就会自动删除。

交换器

服务器会根据路由键将消息从交换器路由到队列。

路由器有4种类型: direct、fanout、topic和headers(不常用)。

direct: 如果路由键匹配的话,消息就被投递到对应到队列。
fanout: 这种类型的交换器会把收到的消息广播到绑定到队列上。
topic: 通过模糊匹配规则,队列接收一类消息。

小结

  • AMQP架构中最关键的几个组件分别是交换器、队列和绑定。
  • 根据绑定规则将队列绑定到交换器上。
  • 消息是发布到交换器上的。
  • 有三种类型的交换器: direct,fanout和topic。
  • 基于消息的路由键和交换器类型,服务器会决定将消息投递到哪个队列去。

虚拟主机和隔离(vhost)

vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列,交换器和绑定,更重要的是,它拥有自己的权限机制。

命令行模式下操作vhost,其中vhost_name就是要操作的vhost

1
2
3
4
5
6
7
8
## 新增vhost
rabbitmqctl add_vhost[vhost_name]

## 删除vhost
rabbitmqctl delete_vhost[vhost_name]

## 列出所有vhost
rabbitmqctl list_vhosts

持久化

如果消息想要从Rabbit崩溃中恢复,那么消息必须:

- 把它的投递模式选项设置为2(持久)
- 发送到持久化的交换器
- 到达持久化的队列

RabbitMQ确保持久性消息能从服务器重启中恢复的方式是,将它们写入磁盘上的一个持久化日志文件。当发布一条持久性信息到持久交换器上时,Rabbit会在消息提交到日志文件后发送响应。