1、vhost 是什么?起什么作用?
vhost 可以理解为虚拟 broker ,即 mini-RabbitMQ server。其内部均含有独立的queue、exchange 和 binding 等,但最最重要的是,其拥有独立的权限系统,可以做到vhost 范围的用户控制。
当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 vhost 中)。
2、AMQP协议3层?
1、 Module Layer:协议最高层,主要定义了一些客户端调用的命令,客户端可以用这些命令实现自己的业务逻辑。
2、 Session Layer:中间层,主要负责客户端命令发送给服务器,再将服务端应答返回客户端,提供可靠性同步机制和错误处理。
3、 TransportLayer:最底层,主要传输二进制数据流,提供帧的处理、信道服用、错误检测和数据表示等。
3、RabbitMQ topic 主题模式(路由模式的一种)
1、 星号井号代表通配符
2、 星号代表多个单词,井号代表一个单词
3、 路由功能添加模糊匹配
4、 消息产生者产生消息,把消息交给交换机
5、 交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费
在我的理解看来就是routing查询的一种模糊匹配,就类似sql的模糊查询方式
4、RabbitMQ基本概念
1、 Broker: 简单来说就是消息队列服务器实体
2、 Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列
3、 Queue: 消息队列载体,每个消息都会被投入到一个或多个队列
4、 Binding: 绑定,它的作用就是把exchange和queue按照路由规则绑定起来
5、 Routing Key: 路由关键字,exchange根据这个关键字进行消息投递
6、 VHost: vhost 可以理解为虚拟 broker ,即 mini-RabbitMQ server。其内部均含有独立的 queue、exchange 和 binding 等,但最最重要的是,其拥有独立的权限系统,可以做到 vhost 范围的用户控制。当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 vhost 中)。
7、 Producer: 消息生产者,就是投递消息的程序
8、 Consumer: 消息消费者,就是接受消息的程序
9、 Channel: 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务
由Exchange、Queue、RoutingKey三个才能决定一个从Exchange到Queue的唯一的线路。
5、消息如何被优先消费?
生产者
Map<String, Object> argss = new HashMap<String, Object>();
argss.put("x-max-priority",10);
消费者
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.priority(5) // 优先级,默认为5,配合队列的 x-max-priority 属性使用
6、在单 node 系统和多 node 构成的 cluster 系统中声明 queue、exchange ,以及进行 binding 会有什么不同?
当你在单 node 上声明 queue 时,只要该 node 上相关元数据进行了变更,你就会得到 Queue.Declare-ok 回应;而在 cluster 上声明 queue ,则要求 cluster 上的全部node 都要进行元数据成功更新,才会得到 Queue.Declare-ok 回应。
另外,若 node 类型为 RAM node 则变更的数据仅保存在内存中,若类型为 disk node 则还要变更保存在磁盘上的数据。
7、RabbitMQ消息是如何路由的?
消息路由必须有三部分:交换器、路由、绑定。
生产者把消息发布到交换器上,绑定决定了消息如何从路由器路由到特定的队列;消息最终到达队列,并被消费者接收。
- 消息发布到交换器时,消息将拥有一个 路由键(routing key) , 在消息创建时设定。
- 通过队列路由键,可以把队列绑定到交换器上。
- 消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则)。如果能够匹配到队列,则消息会投递到相应队列中;如果不能匹配到任何队列,消息将进入"黑洞"。
常用的交换器主要分为以下三种:
- direct :如果路由键完全匹配,消息就会被投递到相应的队列;每个AMQP的实现都必须有一个direct交换器,包含一个空白字符串名称的默认交换器。声明一个队列时,会自动绑定到默认交换器,并且以队列名称作为路由键:channel -> basic_public($msg, '', 'queue-name')
- fanout : 如果交换器收到消息,将会广播到所有绑定的队列上;
- topic :可以使来自不同源头的消息能够到达同一个队列。使用topic交换器时,可以使用通配符,比如:"*" 匹配特定位置的任意文本,"." 把路由键分为了几个标识符, "#" 匹配所有规则等。
- 特别注意:发往topic交换器的消息不能随意的设置选择键(routing_key),必须是有"."隔开的一系列的标识符组成。
8、交换器4种类型?
主要有以下4种。
fanout:把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
direct:把消息路由到BindingKey和RoutingKey完全匹配的队列中。
topic:
匹配规则:
RoutingKey 为一个 点号'.': 分隔的字符串。 比如: java.xiaoka.show
BindingKey和RoutingKey一样也是点号“.“分隔的字符串。
BindingKey可使用 _ 和 # 用于做模糊匹配,_匹配一个单词,#匹配多个或者0个
headers:不依赖路由键匹配规则路由消息。是根据发送消息内容中的headers属性进行匹配。性能差,基本用不到。
9、交换器无法根据自身类型和路由键找到符合条件队列时,有哪些处理?
mandatory :true 返回消息给生产者。
mandatory: false 直接丢弃。
10、RabbitMQ队列结构?
通常由以下两部分组成:
rabbit_amqqueue_process:负责协议相关的消息处理,即接收生产者的消息、向消费者交付消息、处理消息的确认(包括生产端的 confirm 和消费端的 ack) 等。
backing_queue:是消息存储的具体形式和引擎,并向 rabbit amqqueue process 提供相关的接口以供调用。