1、RabbitMQ中的vhost起什么作用?
(1)vhost本质上就是一个mini版的mq服务器(虚拟消息服务器)。
有自己的队列、交换器和绑定,最重要的,拥有独立的权限机制,可以做到vhost范围的用户控制。
(2)Vhost提供了逻辑上的分离,可以将众多客户端进行区分,又可以避免队列和交换器的命名冲突。
(3)Vhost必须在连接时指定,rabbitmq包含缺省vhost:“/”,通过缺省用户和口令guest进行访问。
(4)rabbitmq里创建用户,必须要被指派给至少一个vhost,并且只能访问被指派内的队列、交换器和绑定。
(5)Vhost必须通过rabbitmq的管理控制工具创建。
2、RabbitMQ上的一个queue中存放的message是否有数量限制?限制是多少
默认情况下一般是无限制,因为限制取决于机器的内存,但是消息过多会导致处理效率的下降。
可以通过参数来限制:
- x-max-length :对队列中消息的条数进行限制 ,
- x-max-length-bytes :对队列中消息的总量进行限制
3、说一说RabbitMQ中的AMQP
AMQP 协议即高级消息队列协议
RabbitMQ就是 AMQP 协议的 Erlang 的实现(当然 RabbitMQ 还支持 STOMP2、 MQTT3 等协议)。
AMQP 的模型架构和 RabbitMQ 的模型架构是一样的,生产者将消息发送给交换器,交换器和队列绑定 。
RabbitMQ 中的交换器、交换器类型、队列、绑定、路由键等都是遵循的 AMQP 协议中相 应的概念。
4、RabbitMQ开启持久化机制,有什么要注意的点?
(1)开启持久化后,效率会变低;
(2)开启持久化需要交换器、队列、消息三者都需要持久化;
队列(队列本身【名称、源数据】、队列消息)、交换器、绑定关系都需要开启持久化
5、RabbitMQ中交换器4种类型?
(1)Fanout(广播): 把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
(2)Direct(直接交换器):把消息路由到BindingKey和RoutingKey完全匹配的队列中。
(3)Topic(主题):
匹配规则:
- RoutingKey 为一个点号’.'分隔的字符串。比如: java.xiaoka.show
- BindingKey和RoutingKey一样也是点号“.“分隔的字符串。
- BindingKey可使用 * 和 # 用于做模糊匹配,*匹配一个单词,#匹配多个或者0个
(4)headers:忽略routing_key的一种路由方式,不处理路由键,是根据发送消息内容中的headers属性进行匹配。性能差,基本用不到。(几乎与Direct差不多,不实用,一般会忽略,基本被Direct取代)
6、Rocketmq如何保证高可用性?
- 架构层面
避免用单节点或者简单的一主一从架构,可以采取多主从的架构,并且主从之间采用同步复制的方式进行数据双写。 - 刷盘策略
RocketMQ默认的异步刷盘,可以改成同步刷盘SYNC_FLUSH。 - 生产消息的高可用
当消息发送失败了,在消息重试的时候,会尽量规避上一次发送的 Broker,选择还没推送过该消息的Broker,以增大消息发送的成功率。 - 消费消息的高可用
消费者获取到消息之后,可以等到整个业务处理完成,再进行CONSUME_SUCCESS状态确认,如果业务处理过程中发生了异常那么就会触发broker的重试机制。
7、RocketMq的存储机制了解吗?
消息生产者发送消息到broker,都是会按照顺序存储在CommitLog文件中,每个commitLog文件的大小为1G
CommitLog-存储所有的消息元数据,包括Topic、QueueId以及message
CosumerQueue-消费逻辑队列:存储消息在CommitLog的offset
IndexFile-索引文件:存储消息的key和时间戳等信息,使得RocketMq可以采用key和时间区间来查询消息
也就是说,rocketMq将消息均存储在CommitLog中,并分别提供了CosumerQueue和IndexFile两个索引,来快速检索消息
8、RocketMq性能比较高的原因?
- 顺序写
顺序写比随机写的性能会高很多,不会有大量寻址的过程 - 异步刷盘
相比较于同步刷盘,异步刷盘的性能会高很多 - 零拷贝
使用mmap的方式进行零拷贝,提高了数据传输的效率