RabbitMQ

微服务之RabbitMQ
一.面试热点问题
1.介绍一下RabbitMQ
首先说一下MQ(Message Queue),为什么会产生消息队列呢?(1)如果两进程之间之间进行消息通信,则两进程耦合度过高,若一个进程改变则另一个进程也需要改变,而使用消息队列,则所有消息都是通过消息队列才发送给另一个进程,这样则降低了两进程之间的耦合度。(2)在高并发的情况下,消费者接收到大量的消息,无法处理,因此消息队列可以对消息进行排序,消费者对消息一个一个进行处理。
而RabbitMQ是一种基于AMQP(协议)的高级消息队列,它在消息队列之前加入了交换机,消息的发送是由交换机来控制的。主要有3种形式,fanout,direct,topic.广播模式fnout,每个消息都被所有消费者消费,即交换机将每个消息都发送给每个队列。direct和topic则不同的消息被不同的消费者消费。交换机根据RoutingKey将消息发送给相应的消息队列。
2.RabbitMQ的组件?
(1)ConnectionFactory(连接管理器):应用程序与RabbitMQ之间建立连接的管理器。
(2)exchange(交换机):用来接收提供者发送的消息并将消息发送给消息队列。
(3)queue(队列):用来存储消息,消费者消费存储在消息队列中的消息。
(4)Routtingkey:用来指定消息被谁接收。当生产者向交换机发送消息时会同时发送一个routtingkey,交换机发送给队列消息时,会根据routtingkey来对应相应的bindingkey,从而确定将消息发送到哪个队列。
(5)bindingkey:用来绑定交换机和队列的。
(6)channel(信道):消息推送使用的通道。
2.如何避免消息的丢失?
答:1).使用手动设置ACK,即消费者向RabbitMQ发送一个ACK确认(消费者的确认,保证了消费者不会把消息弄丢)
2).交换机,队列,消息的持久化(避免RabbitMQ把消息弄丢)
3).生产者确认机制,即RabbitMQ向生产方发送回执,确认消息已收到(生产者消息发出,但是由于网络的波动未能成功发送到交换机或队列)
4)发送消息前,将消息持久化到数据库,并记录消息状态(可靠消息服务)
3.activeMQ中没有生产者确认机制?如何解决?
发送消息前,将消息持久化到数据库,并记录消息状态(可靠消息服务)
4.如何改善消息堆积问题?
答: 1) 采用workqueue,多个消费者监听同一队列。
2)接收到消息以后,而是通过线程池,异步消费。
5.消息的重复,有时会有影响,如(转账)
当发生网络延迟时,以为消息没有发送成功,重新发送,导致消息重复发送了。因此要保证处理消息方的幂等性(同一接口被重复执行,其结果保持一致)
6.交换机的交换模型有几种?分别是?
答:交换机的模型有四种,分别是topic,direct,fanout,headers。
7.消息模型有哪些?
(1)基本消息模型
一个生产者,一个消息队列,一个消费者。
(2)work消息模型(任务模型)
一个生产者,一个消息队列,多个消费者。即多个消费者绑定到同一个消息队列上,共同消费队列中的消息。
因此:work模型解决了消息堆积问题。
3.RabbitMQ的消息模型
RabbitMQ模型中多了交换机,交换机将从生产者中收到的消息转发给消息队列,
(1)订阅模型-fanout广播
有多个消费者,每一个消费者有自己的队列,所有消息队列都绑定到交换机上,每个消息都被所有消费者消费。
(2)订阅模型-direct 定向
队列与交换机绑定,指定至少一个RouttingKey。
生产者向对列发送消息,同时发送该消息对应的RouttingKey
交换机根据RouttingKey将消息发送给相应的队列。
即不同的消息发送给不同的消费者。
(3)订阅模型-topic
topic模型也是通过RouttingKey来进行匹配发送,但是topic模型可以让Exchange通过RoutingKey绑定队列时使用通配符。
RouttingKey通常是由多个单词组成,每个单词之间由.隔开。
#:可以匹配一个或多个单词
*:只能匹配一个单词。
(4)订阅模型-headers
header exchange(头交换机)和主题交换机有点相似,但是不同于主题交换机的路由是基于路由键,头交换机的路由值基于消息的header数据
all: 默认值。一个传送消息的header里的键值对和交换机的header键值对全部匹配,才可以路由到对应交换机
any: 一个传送消息的header里的键值对和交换机的header键值对任意一个匹配,就可以路由到对应交换机

队列A:绑定交换机参数是:format=pdf,type=report,x-match=all,
队列B: 绑定交换机参数是:format=pdf,type=log,x-match=any,
队列C:绑定交换机参数是:format=zip,type=report,x-match=all,
消息1发送交换机的头参数是:format=pdf,type=reprot则消息传送到队列A
消息2发送交换机的头参数是:format=pdf则消息传送到队列A和队列B
消息3发送交换机的头参数是:format=zip,type=log则消息没有匹配队列,此消息会被丢弃

8.rabbitMQ中的vhost作用是什么?
vhost可以理解为虚拟broker,即小型的mini-rabbitMQ server.其内部均含有独立的queue,exchang,binding等,但最重要的是,其拥有独立的权限系统,可以做到vhost范围的用户控制。从rabbitMQ全局角度看,vhost可以作为不同权限隔离的手段。
9.怎么保证消息的持久化?
(1)消息队列必须设置为持久化durable为true;
(2)消息推送投递模式设置为持久化 ,deliveryMode设置为2。
(3)消息已经达到持久化交换器。
(4)消息已经到达持久化队列。
10.rabbitMQ在项目中的应用?
在leyou商城中主要用在数据同步中了,在elastic和redis中存储的数据,当数据库中改变了数据,elastic和redis中存储的数据不知道,因此需要用rabbitMQ来进行通信,当数据库中数据发生改变,利用rabbitMQ给elastic发送消息,通知已发生改变。

amqpTemplate.convertAndSend("item-insert",spu.getId());
@RabbitListener(bindings = @QueueBinding(
            value= @Queue(name="search.item.insert.queue",durable="true"),
            exchange=@Exchange(name="ly.item.exchange",type= ExchangeTypes.TOPIC),
            key={"item.insert","item.update"}
    ))
    public void listenListenerOrUpdate(Long spuId){
            if(spuId==null){
                return;
            }
            searchService.createOrUpdateIndex(spuId);
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值