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就是要操作的vhost1
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会在消息提交到日志文件后发送响应。