RabbitMQ基础知识(三)--交换器、虚拟主机和消息持久化

2019-03-13  本文已影响0人  nzdnllm

生产者发送的消息如何到达队列

(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)由于没有回滚的概念,此模式更加轻量级。

上一篇 下一篇

猜你喜欢

热点阅读