RabbitMQ 常见面试题

RabbitMQ 常见面试题
1.RabbitMQ的高可用性如何保证
RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式
镜像集群模式的策略是高可用策略,指定的时候可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,
再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的 节点上去了
Federation,HAProxy,KeepAlived 实现RabbitMQ 负载均衡,集群间节点通信
2.RabbitMQ如何保证不丢数据
消息的延迟投递,做二次确认,回调检查
首次发送[发送前入库BIZ DB] ->消费端 成功消费消 ->发送确认消息->监听服务监听该队列 -> 监听服务[callback service]相当于补偿服务(入库MSG DS)
->监听服务[callback service]监听延迟消息,确认首次发送是否成功
参考图 [RabbitMQ消息队列_可靠性投递结构图.png]
RabbitMQ 常见面试题
文章图片

3.消息幂等性
1)借鉴数据库乐观锁机制, version版本号
2)唯一ID + 指纹码机制,利用数据库主键去重
select count(1) from table where id = 唯一ID+指纹码 返回0,正常插入,1已存在
实现简单 >> 高并发下有数据库写入的性能瓶颈
方法:对ID进行分库分表 进行算法路由
3)<更新>接口设计,统计方式:例子如下
【一个幂等的操作典型如:把编号为5的记录的A字段设置为0这种操作不管执行多少次都是幂等的。一个非幂等的操作典型如:
把编号为5的记录的A字段增加1这种操作显然就不是幂等的。要做到幂等性,从接口设计上来说不设计任何非幂等的操作即可。
譬如说需求是:当用户点击赞同时,将答案的赞同数量+1。改为:当用户点击赞同时,确保答案赞同表中存在一条记录,用户、答案。
赞同数量由答案赞同表统计出来】
4.集群节点类型都有什么
磁盘节点,内存节点
磁盘节点就是配置信息和元信息存储在磁盘上,内存节点把这些信息存储在内存中,当然内次节点的性能是大大超越磁盘节点的。
单节点系统必须是磁盘节点,否则每次你重启RabbitMQ之后所有的系统配置信息都会丢失。
RabbitMQ要求集群中至少有一个磁盘节点,当节点加入和离开集群时,必须通知磁盘节点。
5.消息队列有什么优缺点
优点:解耦、异步、削峰
缺点:系统可用性降低,引入MQ系统变得更加复杂
6.RabbitMQ中的 broker 是指什么?cluster 又是指什么?
broker 是指一个或多个 erlang node 的逻辑分组,且 node 上运行着 RabbitMQ 应用程序。
cluster 是在 broker 的基础之上,增加了 node 之间共享元数据的约束
【RabbitMQ 常见面试题】7.什么是元数据?元数据分为哪些类型?包括哪些内容?与 cluster 相关的元数据有哪些?元数据是如何保存的?元数据在 cluster 中是如何分布的?
在非 cluster 模式下,元数据主要分为 Queue 元数据(queue 名字和属性等)、Exchange 元数据(exchange 名字、类型和属性等)、Binding 元数据(存放路由关系的查找表)、
Vhost 元数据(vhost 范围内针对前三者的名字空间约束和安全属性设置)。在 cluster 模式下,还包括 cluster 中 node 位置信息和 node 关系信息。元数据按照 erlang node 的类型确定是仅保存于 RAM 中
,还是同时保存在 RAM 和 disk 上。元数据在 cluster 中是全 node 分布的。
8.RAM node 和 disk node 的区别?
RAM node 仅将 fabric(即 queue、exchange 和 binding等 RabbitMQ基础构件)相关元数据保存到内存中,但 disk node 会在内存和磁盘中均进行存储。
RAM node 上唯一会存储到磁盘上的元数据是 cluster 中使用的 disk node 的地址。要求在 RabbitMQ cluster 中至少存在一个 disk node 。
9.routing_key 和 binding_key 的最大长度是多少?
255 字节。
10.RabbitMQ 允许发送的 message 最大可达多大?
根据 AMQP 协议规定,消息体的大小由 64-bit 的值来指定。
11.:为什么说保证 message 被可靠持久化的条件是 queue 和 exchange 具有 durable 属性,同时 message 具有 persistent 属性才行?
binding 关系可以表示为 exchange – binding – queue 。从文档中我们知道,若要求投递的 message 能够不丢失,要求 message 本身设置 persistent 属性,
要求 exchange 和 queue 都设置 durable 属性。其实这问题可以这么想,若 exchange 或 queue 未设置 durable 属性,则在其 crash 之后就会无法恢复,
那么即使 message 设置了 persistent 属性,仍然存在 message 虽然能恢复但却无处容身的问题;同理,若 message 本身未设置 persistent 属性,则 message 的持久化更无从谈起
12.什么情况下会出现 blackholed 问题?
blackholed 问题是指,向 exchange 投递了 message ,而由于各种原因导致该 message 丢失,但发送者却不知道。可导致 blackholed 的情况:
1).向未绑定 queue 的 exchange 发送 message;
2).exchange 以 binding_key key_A绑定了 queue queue_A,但向该 exchange 发送 message 使用的 routing_key 却是 key_B。
13.如何防止出现 blackholed 问题?
没有特别好的办法,只能在具体实践中通过各种方式保证相关 fabric 的存在。另外,如果在执行 Basic.Publish 时设置 mandatory=true ,则在遇到可能出现 blackholed 情况时,
服务器会通过返回 Basic.Return 告之当前 message 无法被正确投递( 内含原因 312 NO_ROUTE )。

    推荐阅读