[转帖]RabbitMQ的Vhost,Exchange,Queue原理分析

rabbitmq,vhost,exchange,queue,原理,分析 · 浏览次数 : 0

小编点评

**Vhost** Vhost 是一个用于划分不同业务模块的容器。它可以被多个用户访问,而一个用户可以同时访问多个Vhost。 Vhost主要用于用户,权限相关。 **Exchange** Exchange 是一个用于数据交换的容器。它不保存数据,数据会被保存到队列中。Exchange是属于Vhost的,同一个Vhost不能有重复的Exchange名称。 **Queue** Queue 是一个用于存放发送和接收消息的容器。消息可以被发送到多个Queue中,并且可以从多个Queue中接收消息。 **原理分析** Vhost的主要作用是隔离不同业务模块,确保数据安全。它可以通过Vhost之间的手动构建代码逻辑实现数据共享和分享。 **例子** 假设我们有一个名为“wuge”的Vhost,它包含两个Exchange:“/”和“testvh”。 ``` vhost wuge { exchange / { bindings: ( fanout, direct, ) } exchange testvh { bindings: ( topic ) } } ``` **总结** Vhost 是一个用于划分不同业务模块的容器,它可以隔离不同Exchange和Queue,并通过Vhost之间的手动构建代码逻辑实现数据共享和分享。

正文

RabbitMQ的Vhost,Exchange,Queue原理分析
https://www.cnblogs.com/zhengchunyuan/p/9253725.html

 

Vhost分析

RabbitMQ的Vhost主要是用来划分不同业务模块。不同业务模块之间没有信息交互。

Vhost之间相互完全隔离,不同Vhost之间无法共享Exchange和Queue。因此Vhost之间数据无法共享和分享。如果要实现这种功能,需要Vhost之间手动构建对应代码逻辑。

如上图所示。 我在Vhost “/”下,无法增加"/testvh"下的wuge.qu.rec,提示我没有对应的信息。

Vhost主要于用户,权限相关。

Vhost其实在用户之间是透明的,Vhost可以被多个用户访问,而一个用户可以同时访问多个Vhost。 例如:wuge可以同时访问"/"和"testvh"

Exchange分析

Exchange主要是数据交换,他并不保存数据,数据都会保存到Queue中。但是注意Exchange是Durable情况下,才满足持久化三个要求之一。

Exchange是属于Vhost的。同一个Vhost不能有重复的Exchange名称。 Exhange有四种类型:fanout,Direct,header,topic (后面会有更详尽的讲解)

Internal表示只能用于Exchange之间进行绑定。不能外部绑定。 Alternate exchange,当发送到这个exchange时候,不存在对应Route Key。那么消息会被发送到Alternate exchange。

Exchange的绑定功能,可以绑定queue,也可以绑定Exchange。这个看具体业务了。

如果绑定数据,需要在分发或者重新被分派,使用To Exchange绑定。如果要被直接处理,使用queue绑定。

如果Exchange绑定了Queue,如果Route Key不对,也会导致数据不可达,被丢掉。(一个数据可以被Queue处理,需要Exchange绑定Queue,并且在Message发送的时候,Route Key 与绑定的Key相等。)

我们发送一个空数据,Route Key随便制定了Hello,消息虽然发送,但是客户获得失败。 说明:Properties主要是RabbitMQ自己的属性,例如,消息状态为持久化。

Queue分析

数据可以保存到队列之后,就可以处理了。

我们这里可以看到,存储状态。是否自动删除自己(现有consumer连接,然后consumer断开,Queue删除自己)。Message TTL (消息保存时间,单位ms), Auto expire(消息通道自动过期,单位ms), Max Length (消息最大数量,当超过的时候,删除)。

Dead letter exchange,当消息不能处理后,向Dead letter exchange发送,这时候路由是Route Key 等于消息Router Key Dead letter routing key,当消息不能处理后,向Dead Letter routing key 发送。这时候Exchange是是Dead letter exchange, Route key等Dead letter routing key.

可以看到Properties里面记录了对应日志状态。消息的来源。

消费现象

RabbitMQ的消息状态

每个消息存储在RabbitMQ中都有自己的状态:Ready,Unacked,Ack

  • Ready:等待消费状态。
  • Unacked:等待被确认状态,当前消息已经被发送到了客户端。当客户端端断开后,如果这条消息没有被确认,这条消息重新进入Ready中。

RabbitMQ客户端接受消息最大数量

 channel.BasicQos(0, 1, false);
  • 第一个参数是prefetch_size:这个RabbitMQ没有实现。
  • 第二个参数是perfetch_count:这个数字表示没有确认的消息,最多可以接收perfetch_count个数。如果perfetch_count 为1,那么接受到一个消息后,就不能再接受更多的数据了,直到这个msg被确认。
  • 第三个参数是global set:设置是否影响全部channel,我们知道一个Connection可以生产多个channel,因此我们可以为全局设置最大perfetch_count;

与[转帖]RabbitMQ的Vhost,Exchange,Queue原理分析相似的内容:

[转帖]RabbitMQ的Vhost,Exchange,Queue原理分析

RabbitMQ的Vhost,Exchange,Queue原理分析https://www.cnblogs.com/zhengchunyuan/p/9253725.html Vhost分析 RabbitMQ的Vhost主要是用来划分不同业务模块。不同业务模块之间没有信息交互。 Vhost之间相互完全隔

[转帖]RabbitMQ 的重要概念(术语)

Message 消息指的是 RabbitMQ 的队列中保存的数据。 Producer 消息的生产者,即 message publisher(sender),是指负责创建和发送消息的程序。 Vhost RabbitMQ 的虚拟主机,一个 broker 里可以开设多个 vhost,用作不同用户的权限分离

[转帖]RabbitMQ服务优化,修改最大连接数

https://www.cnblogs.com/hoyeong/p/16242202.html RabbitMQ的优化RabbitMQ的连接数是压垮消息队列的一个重要的指标。所以在平时使用OpenStack平台的过程中,如果大量的用户同时创建虚拟机,会导致云平台创建报错,其实就是消息队列服务的崩溃。

[转帖]RabbitMQ性能优化

https://www.cnblogs.com/zhengchunyuan/p/9253728.html 修改rabbitmq.config文件 rabbitmq.config文件时rabbitmq的配置文件,他遵守Erlang配置文件定义。 rabbitmq.config文件位置: Unix $R

[转帖]RabbitMQ:Exchange的Fanout类型的介绍和使用

https://blog.csdn.net/weixin_45492007/article/details/106095591 1.声明 当前的内容用于本人学习和使用Fanout类型的Exchange,主要理解其主要作用 2.Fanout Exchange的官方介绍 扇出交换机将消息路由到与其绑定的

[转帖]RabbitMQ erlang.cookie解惑

https://www.cnblogs.com/xgtx/articles/6068392.html 在搭建RabbitMQ集群的时候往往会因为.erlang.cookie而报各种错误,网上查资料也会经常说.erlang.cookie会在$home下,或者在/var/lib/rabbitmq下,到底

[转帖]如何选择RabbitMQ的消息保存方式?

https://www.cnblogs.com/zhengchunyuan/p/10179677.html RabbitMQ对于queue中的message的保存方式有两种方式:disc和ram。如果采用disc,则需要对exchange/queue/delivery mode都要设置成durabl

[转帖]RabbitMQ 如何保证交换机中的消息不丢失

我们知道,生产者会先将消息发送给交换机,但是如果交换机此时没有匹配到相关的队列时,交换机中的消息就会出现丢失的问题。 那么,如何保证交换机中的消息不丢失呢? mandatory 参数 当 basicPublish 方法的 mandatory 参数设为 true 时,如果交换器无法匹配到绑定的队列,那

[转帖]RabbitMQ 消费者回执和发布确认

为了保证数据安全,消费者和生产者的回执(ack)都是非常重要的。 由于我们无法保证消息都能像我们期望的那样,正常到达另一端或者被 Consumer 消费成功。因此,publisher 和 consumer 都需要一种机制,来确保消息投递成功了和消息消费成功了。 在 AMQP 0-9-1 中,消费者处

[转帖]RabbitMQ学习笔记05:Routing

参考资料:RabbitMQ tutorial - Routing — RabbitMQ 前言 在之前的文章中我们构建了一个简单的日志系统,它可以广播消息到多个消费者中。 在这篇文章中,我们打算实现仅订阅消息的子集(即不是所有的消息,仅仅只是一部分消息。注意,这里不是说一条消息的一部分)。例如我们只会