rebbitmq面试题

为什么使用消息队列啊?

解耦、异步、削峰

消息队列有什么优点和缺点啊?

优点:解耦、异步、削峰

缺点:

1)系统可用性降低,系统引入的外部依赖越多,越容易挂掉,MQ挂了之后导致整个系统崩溃。
2)系统复杂度提高,硬生生加个MQ,怎么保证消费没有重复消费?怎么出来消费数据没有丢失?怎么保证消息传递的顺序性,一致性等问题?
3)一致性问题,A系统处理完后直接将返回成功了,那么消费者B,C,D三个系统中,只有B,C系统写入库中成功,D系统写入失败,如何保证数据的一致性问题呢?


如何确保消息正确地发送至 RabbitMQ

事务的提交

通过发送方确认(publisher confirm)机制实现

事务机制和publisher confirm机制是互斥的,不能共存

事务的提交的

  • channel.txSelect:用于将当前的信道设置成事务模式
  • channel.txCommit:用于提交事务
  • channel.txRollback:用于回滚事务

confirm

  • channel.confirmSelect();将信道设置成confirm模式
  • channel.waitForConfirms();等待发送消息的确认消息,如果发送成功,则返回ture,如果发送失败,则返回false

 

如何确保消息接收方接受了消息

  • 把自动ack改为手动ack       boolean autoAck = false;

交换机的持久化

durable=true;

channel.exchangeDeclare(EXCHANGE_NAME, "direct", true);

 

队列的消息持久化

durable=true;

channel.queueDeclare(QUEUE_NAME, true, false, false, null)

消息的持久化

deliveryMode模式设置为2

new AMQP.BasicProperties().builder().deliveryMode(2).build();

-------------------------------------------------https://www.cnblogs.com/zwwhnly/p/10953388.html--------这个比较好----------------------

RabbitMQ 中的 broker 是指什么?cluster 又是指什么?


broker 是指一个或多个 erlang node 的逻辑分组,且 node 上运行着 RabbitMQ 应用程序。cluster 是在 broker 的基础之上,增加了 node 之间共享元数据的约束


RabbitMQ 概念里的 channel、exchange 和 queue 是逻辑概念,还是对应着进程实体?分别起什么作用?


queue 具有自己的 erlang 进程;exchange 内部实现为保存 binding 关系的查找表;channel 是实际进行路由工作的实体,即负责按照 routing_key 将 message 投递给 queue 。由 AMQP 协议描述可知,channel 是真实 TCP 连接之上的虚拟连接,所有 AMQP 命令都是通过 channel 发送的,且每一个 channel 有唯一的 ID。一个 channel 只能被单独一个操作系统线程使用,故投递到特定 channel 上的 message 是有顺序的。但一个操作系统线程上允许使用多个 channel 

 


vhost 是什么?起什么作用?


vhost 可以理解为虚拟 broker ,即 mini-RabbitMQ  server。其内部均含有独立的 queue、exchange 和 binding 等,但最最重要的是,其拥有独立的权限系统,可以做到 vhost 范围的用户控制。当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 vhost 中)

消息基于什么传输?

由于TCP连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。

消息如何分发?

若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。

消息怎么路由?


从概念上来说,消息路由必须有三部分:交换器、路由、绑定。生产者把消息发布到交换器上;绑定决定了消息如何从路由器路由到特定的队列;消息最终到达队列,并被消费者接收。

消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定。
通过队列路由键,可以把队列绑定到交换器上。
消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则)。如果能够匹配到队列,则消息会投递到相应队列中;如果不能匹配到任何队列,消息将进入 “黑洞”

 

什么是元数据?元数据分为哪些类型?包括哪些内容?与 cluster 相关的元数据有哪些?元数据是如何保存的?元数据在 cluster 中是如何分布的?


在非 cluster 模式下,元数据主要分为 Queue 元数据(queue 名字和属性等)、Exchange 元数据(exchange 名字、类型和属性等)、Binding 元数据(存放路由关系的查找表)、Vhost 元数据(vhost 范围内针对前三者的名字空间约束和安全属性设置)。在 cluster 模式下,还包括 cluster 中 node 位置信息和 node 关系信息。元数据按照 erlang node 的类型确定是仅保存于 RAM 中,还是同时保存在 RAM 和 disk 上。元数据在 cluster 中是全 node 分布的
————————————————
版权声明:本文为CSDN博主「jeffrey_ding」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jerryDzan/article/details/89183625

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值