RabbitMQ面试题

MQ是什么,应用场景
  • MQ:全称为Message Queue,又名消息队列。
  • 衡量MQ的标准:服务性能、数据存储、集群架构
    1、解耦,即:解除耦合关系。(系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,代表代码耦合。)
    2、异步,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
    3、削峰,并发量大的时候,所有的请求直接访问数据库,造成数据库连接异常,可用mq解决高并发等场景。
描述RabbitMQ架构,有哪些概念

Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
[Publish]Producer:消息生产者,就是投递消息的程序。
[Subscriber]Consumer:消息消费者,就是接受消息的程序。
Channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

描述RabbitMQ所理解的工作模式,所知道的交换机

消息通信是由两个角色完成:消息生产者(provider)和消息消费者(consumer)
工作模式:不同业务的应用场景解决方案

工作模式:
简单队列模式(单发送单接收)
工作队列模式(单发送多接收【队列采用轮询的方式将消息平均发送给消费者】)
发布订阅队列模式:(广播)消费者将消息首先发送到交换器,交换器绑定到多个队列,然后被监听该队列的消费者所接收并消费
路由队列模式:(消费者有选择性的接收消息) 生产者将消息发送到direct交换器,在绑定队列和交换器的时候有一个路由key(routing_key),生产者发送的消息会指定一个路由key,那么消息只会发送到相应key相同的队列,接着监听该队列的消费者消费消息
主题队列模式:对路由队列模式进行了升级,支持队列的模糊查询操作*表示单个单词,.进行分隔,#代表任意字符

交换机:
直连交换机 如果路由键完全匹配的话,消息才会被投放到相应的队列
扇形交换机 (广播)当发送一条消息到fanout交换机上时,它会把消息投放到所有附加在此交换器上的队列
主题交换机 主题交换机的routing_key需要有一定的规则, *表示单个单词,.进行分隔,#代表任意字符
首部交换机 (和主题交换机有点相似,场景类似、无需了解)

什么是生产者,什么是消费者

生产者:产生消息的一方。
消费者:消息消费者,就是接受消息的程序。消费者连接到RabbitMQ服务器,并订阅(监听RabbitListener)到队列上。消费消息体

如何避免消息重复消费?

消息消费时,要求消息体中必须要有一个 业务id(对于同一业务全局唯一,如支付id、订单id等)作为去重和幂等的依据,避免同一条消息被重复消费。(例如:redis 幂等性 或数据库唯一索引等功能实现)

RabbitMQ如何实现延迟队列?

1、MQ安装延迟队列插件。
2、定义延迟队列交换机CustomExchange type=x-delayed-type

RabbitMQ如何保证消息的可靠性

1、生产者没有成功把消息发送到MQ
丢失原因:因为网络传输的不稳定性,当生产者在向mq发送消息的过程中,mq没有成功收到消息,但是生产者却以为mq成功收到消息,没有再次重复发送该消息,从而导致消息的丢失。
实现原理:在生产者那里设置开启 confirm 模式,生产者每次写的消息都会分配一个唯一的 id,如果消息成功写入 RabbitMQ中,RabbitMQ 会给生产者回传一个ack消息,即发送成功。如果 RabbitMQ 没能处理这个消息,会回调你的一个 nack接口,告诉你这个消息接收失败,生产者可以重新发送。

2、消费者没有该消息
丢失原因:RabbitMQ成功的把消息发送给了消费者,RabbitMQ的ack机制会自动的返回成功,表明发送消息成功,下次就不会发送这个消息。但如果就在此时,消费者还没处理完该消息,消费者宕机了,此时这个消息即无法消费。
解决办法:如果是单个消费者:RabbitMQ消息丢失之后的处理:等待消费者启动,消息自动重新入队执行。
如果是集群:RabbitMQ 会把这个消费分配给其它 consumer 去处理,消息不会丢失。

RabbitMQ保证消息的有序性

原因:消息队列中的若干消息如果是对同一个数据进行操作,这些操作具有前后的关系,必须要按前后的顺序执行,否则就会造成数据异常。
产生的原因:比如数据库对一条数据依次进行了 插入->更新->删除操作,这个顺序必须是这样,如果在同步过程中,消息的顺序变成了删除->插入->更新,那么原本应该被删除的数据,就没有被删除,造成数据的不一致问题。

顺序错乱场景一:
一个queue,有多个consumer去消费,这样就会造成顺序的错误,consumer从MQ里面读取数据是有序的,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。

顺序错乱场景二:
一个queue对应一个consumer,但是consumer里面进行了多线程消费,这样也会造成消息消费顺序错误。

最佳答案:
一个queue对应一个consumer,这个consumer内部用队列做排队,然后分发给底层不同的worker来处理。(即按顺序)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值