[rabbitMQ] 基本概念和分发策略
参考博客:
https://www.jianshu.com/p/79ca08116d57
https://www.cnblogs.com/williamjie/p/9481774.html
1.rabbitMQ的特点
可靠性:使用持久化(持久化至本地,重启节点时读取)、传输确认、发布确认机制来确保可靠。
灵活路由:使用交换器(Exchange)来确定将消息放入哪一个队列中,rabbitMQ有数种内置交换器,也可以自己实现交换器。
消息集群:多个服务器组成一个集群形成一个逻辑上的Broker。(处理消息时资源等级为borker->virtual host,每个vhost使用多个exchange和连接channel)
高可用性:可以在集群中设置队列镜像备份,使得部分节点出错时依然可用。
多协议支持:STOMP和MQTT等。
管理页面:以用的UI页面。
跟踪机制:可以最终消息异常问题。
插件机制:确保rabbitMQ的功能可扩展性。
2.基本概念
Message,消息,由消息头(可选属性,如优先级、delivery-mode、路由键等)和消息体(数据)组成。
Publisher,消息生成者。
Consumer,消费者。
Exchange,交换器,负责将消息按策略存入队列中。交换器可以被看做由多个绑定构成的路由表(根据消息头的路由键进行转发)。
Binding,绑定,关联交换器和消息队列。
Queue,消息队列,保存消息的地方。
Connection,连接,组件和外界通信的实际连接。
Channel,信道,因为建立和销毁TCP连接的开销较大,因此在TCP内部使用虚地址进行连接复用。对于同一个地址的不同通信需求使用多个信道完成。
Virtual Host,虚拟主机,每个虚拟主机拥有自己的队列、交换器、绑定,实际上是处理消息的最小单元。多个虚拟主机共享相同的身份认真和加密环境。
Broker,服务器的服务实例(一个Broker拥有多个Virtual Host,可以由多个物理节点组成)。
3.基本Exchange类型
direct
消息中的路由键如果和queues的binding key一致,则将消息直接放入消息队列中。
fanout
每个发到fanout交换器的消息都会分到所有队列上,使用起来类似于子网广播。
topic
将消息头的路由键和消息队列上的binding key做匹配(类似于正则匹配),找到匹配的消息队列后发送过去。
headers
不依赖routing key和binding key做匹配,而是根据消息头的属性进行匹配。
4.RabbitMQ模型
1. 生产者程序和消费者程序和消息队列服务建立连接和通道(一个进程使用一个连接,对一个队列的监听使用一个通道)。
2. 生产者或者消费者可以使用内置的四种exchange模板实例化exchange(并给予string标签),然后将exchange和消息队列绑定。
3. 生产者向高级消息队列broker发送请求,找到服务的virtual host并建立channel连接,指定接受消息的exchange。(即一个生产者可以和多个exchange连接)
4. exchange实例根据规则和binding key决定转发消息队列。
5. 消费者根绝exchange和消息队列名称建立channel连接并获取消息。
生产者过程
1)创建连接
2)创建通道
3)声明队列(并指定其交换机)
4)发送消息
消费者过程
1)创建连接
2)创建通道
3)声明队列
4)监听队列
5)接收消息
6)ACK回复
注:步骤5可以不光是接收消息,还有完成消息处理,这样可以保证消息处理完毕后再发送ACK,期间不会从队列接受到新的消息。