RabbitMQ基础知识(三)--交换器、虚拟主机和消息持久化
生产者发送的消息如何到达队列
(1)队列通过路由键绑定到交换器上
(2)消息发送至代理服务器时,消息会拥有一个路由键(可以为空)
(3)RabbitMQ将消息的路由键和绑定的路由键进行匹配
(4)若匹配,消息会被投递到对应队列;
交换器的类型
背景:用于将消息分发给绑定到一个交换器上的多个队列
(1)direct:消息的路由键与绑定的路由键完全匹配,消息就会被投递至该队列
(2)fanout:与路由键无关,当交换器设置为此模式时,消息会被发送给所有绑定当前交换器的队列
(3)topic:支持消息的路由键与绑定的路由键进行模糊匹配,设置此模式时,绑定的路由键使用“”和“#”即可。
说明 :“”匹配特定位置的任意文本;“#”匹配所有规则
(4)header:与direct规则完全一致,但是性能差很多,所以不常用
虚拟主机vhost
(1)是RabbitMQ权限机制的基本单位
(2)在各个实例间提供逻辑分离,将RabbitMQ的客户区分开来,允许不同程序安全保密的运行,也避免了队列和交换器的命名冲突
(3)vhost之间是绝对隔离的,这样既保证了安全性,又有可移植性
(4)在RabbitMQ集群中创建1个vhost时,整个集群都会创建该vhost。这样避免了为基础架构中的每一层创建一个RabbitMQ服务器,也避免了为每一层创建不同的集群。
消息持久化
1.背景:程序或者服务重启后仍需要将未分发的消息进行重新发送
2.消息持久化的必要条件
(1)将消息的投递模式选项设置为即持久化模式
(2)消息发送到的持久化的交换器中
(3)消息最终到达的队列是持久化的
3.如何应用消息持久化
背景:消息持久化会降低性能
(1)选择关键消息做持久化
(2)运行RabbitMQ集群,非持久化集群和持久化集群做负载均衡,保证了持久化消息的处理不会减慢非持久化消息处理的性能
事务的应用
背景:发布消息的操作不会返回任何信息给生产者,我们在持久化时无法确认消息是否被持久化到磁盘,我们无法知道消息是否在持久化之前就已经丢失了,所以
(1)与数据库中的事务概念不同
(2)把确认代理服务器RabbitMq收到消息,以及将消息路由到所订阅的队列中这一系列行为包装到一个事务中
(3)通过把信道设置为事务模式后,先发送确认消息,在发送AMQP命令
,若第一条发送成功了,则继续发送之后的命令;发送完成所有命令后即可提交事务;若发送第一条发送失败了,则不会发送之后的命令
发送方确认模式
背景:事务会降低Rabbit的性能,还会使生产者的应用程序产生同步
(1)将信道设置成confirm模式,这种模式只能通过重新创建信道来关闭该模式
(2)当消息进入confirm模式的信道,该消息就会被指派一个唯一ID,当消息被投递给指定的队列后,信道会发送一个发送方确认(包含消息唯一ID)给生产者;当消息丢失是,RabbitMQ会发送一个未确认消息给生产者,告知消息已丢失。
(3)由于没有回滚的概念,此模式更加轻量级。