rabbitmq面试问题总结

1.rabbitmq的工作原理图

  • 组件说明
    1 broker:消息队列进程,此进程包括exchange和queue.
    2 exchange:消息队列交换机,按照一定的规则将消息转发到某个队列,对消息进行过滤
    3 queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方
    4 producer:消息提供方,即消息生产方客户端,生产方客户端将消息发送到MQ
    5 Consumer :消息消费方,即消费方客户端,接受MQ转发的消息。
2.rabbitmq消息发送过程:

1.生产者与broker建立TCP链接

  1. 生产者与broker建立链接通道channel
  2. 生产者通过通道消息发送给broker,由Exchange将消息进行发送
  3. exchange将消息转发给指定的queue
3.rabbitmq消息发送过程:
  1. 消费者与broker建立tcp链接
  2. 消费者和Broker建立通道
  3. 消费者监听指定的queue
  4. 当有消息到达queue时broker默认把消息推送给消费之
  5. 消息接收并且消费
4.rabbitmq的工作模式:
  • work queues工作队列



    多个队列同时消费一个队列中的消息,消息不能被重复消费,rabbitmq通过轮询的方式将消息平均分配给消费者

  • publish/subscribe 发布/订阅模式


    image.png

    一个生产者推送消息给交换机,由交换机将消息转发到绑定此交换机的每个队列里。

  • routing 漏油模式


    image.png

    一个交换机绑定多个队列,每个队列设置了routekey ,并且一个队列可以设置多个routekey, 交换机通过消息的routekey进行与队列匹配,发送消息给到匹配上的队列中

  • topics模式


    image.png

    交接机通过通配符匹配对数据进行投递

  • topics模式和路由模式的区别: 路由模式的相等匹配,而topics模式是通配符匹配
  • header模式
    header模式与routing模式的不同之处是,header模式取消了routingkey,使用header中的key/value(键值对)进行匹配
5.消息队列的使用场景:
  • 解耦,异步,削峰
    1 解耦场景分析:
    没有使用消息队列的时候,A服务需要调用多个服务去实现功能:


    image.png

    使用消息队列后,A服务只需要关注自己的业务,通过消息中间件去发送这些消息给其他服务。


    image.png

    异步场景分析
    没有使用消息中间件:所以业务都是串行进行,增加了用户的等待时间,并且有些非主要任务不需要用户一直等待,
    引入中间件后,用户的操作只是处理最重要的功能,当其他非主要功能使用通过消息中间件去处理这些任务。
  • 削峰场景描述:当同一时刻大量请求涌入,是服务器请求过载,造成服务阻塞被打死的情况,使用rabbitmq使过多请求进入rabbitmq中,从而缓解服务器的压力。
6.使用rabbitmq后服务的缺点有:
  1. 系统的可用性降低
  2. 系统的复杂性增加
7.rabbitmq如何保证高可用性
  1. rabbitmq支持三种模式: 1.单机,2.集群,3.镜像集群模式
  • 单机模式:demo级任务
  • 集群模式:当启动三台机子,在当中的一个服务创建了一个队列,当前的机子就有了这个消息的元数据和数据,而其他服务只有当前消息的元数据,当消费者链接其中的一个机子进行获取数据的时候,服务会找到他的元数据,通过元数据中的地址信息到别的机子上找到存储,当前数据的那个机子,如果存储数据的机器挂掉,数据就会丢失
    -镜像集群模式:当消息被写在其中一个服务的话,其他的机器也会进行通过更新获取当前的数据,缺点:当一个数据很大的话,其他机子也会全部满额。
7.如何保证消息不会被重复消费:
  • 幂等性解释: 就是一个相同的数据给你来了多变,需要确定对应的数据,不会因为多次的发送而发送改变。
  • 1.对获取到的信息记录到对应的表中,每次查询当前数据是否已经被消费过了,从而避免消息的重复消费。
    -2. 对修改的数据加入一个唯一键值判断,每次都把消息的id放入,当这条消息被消费过的话,当前的插入就会报错,不能重复的插入。
8.如果保证rabbitmq的消息不会出现丢数据的问题
  1. 生产者的情况: 生产者处理丢失数据的情况rabbitmq有两种方法:1)事物机制但是需要同步等待;2)confirm模式,通过回调方法去判断数据是否发送成功,异步,不需要线程等待。
  2. rabbitmq端: 对数据进行磁盘化操作,
  3. 消费者端:关闭自动ACK,每次消费完成需要手动ack通知rabbitmq当前消息已经消费完毕。
9.如何保证数据的顺序性,

1.对一个队列只是使用一个服务进行消费,保证每次消费完队列中的消息后再去消费第二条消息。

你可能感兴趣的:(rabbitmq面试问题总结)