MQ消息队列面试题

MQ消息队列面试题

什么是消息队列

消息队列,就是指保存消息的一个容器。类似于数据库、缓存等,用来保存数据的。
消息队列,就是一个使用队列来通信的组件

为什么需要消息队列,消息队列的应用场景

提供系统性能首先考虑的是数据库的优化,但是数据库因为历史原因,横向扩展是一个非常复杂的工程,所以我们一般会尽量把流量都挡在数据库之前。
消息队列就可以将流量挡在前面,有如下的应用场景

  • 异步处理:异步发送邮件、短信等
  • 应用解耦:订单系统和库存系统解耦
  • 流量削峰:秒杀
  • 消息通讯:聊天室,在一个主题下 实现点对点、群聊
  • 海量数据同步(日志):kafka,binglog同步
  • 任务调度:延迟队列、死信队列 的应用。订单超时30分钟取消订单
  • 分布式事务:RabbitMQ(comfirm,手动ack)、RocketMQ(支持事务)

消息队列的优缺点

  • 优点:解耦、异步、削峰等场景
  • 缺点:保证MQ可用性、系统复复杂度提升、一致性问题

如何保证消息队列的高可用

集群部署

  • RabbitMQ集群部署有两种模式:镜像队列模式、普通模式(通过共享元数据实现集群,所以普通模式不能实现高可用,某个节点挂了,这个节点上的消息将无法被消费)
  • Kafka:通过zookeeper管理Broker与consumer的动态加入与离开
  • RocketMQ:通过NameServer管理Broker。NameServer和Zookeeper的作用差不多

如何保证消息的可靠性,如何保证消息不丢失

  • RabbitMQ:
    第一种:事务(不推荐)
    第二种:
    生产端 开启Comfirm
    Broker 持久化 交换机、队列、消息
    消费端 手动ACK
  • Kafka:Kafka消息一直存储在磁盘中,定时清理,可以重复消费。由Consumer自己保存状态,也不要任何确认,consumer可以再次获取消息
  • RocketMQ:
    事务消息,手动ACK都可以

如果处理重复消息(幂等性)

幂等处理:每一个消息用一个唯一的表示区分,消费前先判断标识有没有被消费,若已消费,直接ACK

如何保证消息的有序性

  • RabbitMQ:将消息放入同一个交换机,交给一个队列,这个队列只有一个消费者,消费者只允许同时开启一个线程
  • Kafka:partition是一个有序队列,所以 消息发送给一个partition,group中就有一个消费者,实现有序
  • RocketMQ:支持顺序消费,将消费发送给一个queue,一个单线程的消费者

如果处理消息堆积

  • 消息堆积 往往是因为 生产者生产速度和消费者消费速度不匹配造成的。
  • 首先需要先定位消费慢的原因,如果是bug先处理bug。如果是消费者本身能力弱,我们需要优化消费者能力,比如之前一条一条消费,改成批量消费
  • 如果优化完毕,还是慢,那就需要水平扩容了,增加Topic数据和消费者数量。如果是bug影响的那么就可以增加临时队列提高消费速度,恢复之后,在将临时队列和consumer停掉

说一下你了解的MQ,说出几种MQ之间的区别

RabbitMQ、Kafka、RocketMQ

  • RabbitMQ传统消息队列,性能优化ActiveMQ,也支持高可用
  • Kafka 流式处理,性能强,一般用户日志等处理
  • RocketMQ,集成了RabbitMQ和Kafka的优点,性能强,但是社区不活跃、文档不充分
    MQ消息队列面试题_第1张图片

低延时高吞吐,做了什么优化

消息顺序读写、PageCache读写缓存、异步刷盘、零拷贝、分区机制 提升并发、压缩消息、批量处理

RabbitMQ整个流程,RabbitMQ 有哪些重要的角色,RabbitMQ 有哪些重要的组件

看RabbitMQ开头的笔记
MQ消息队列面试题_第2张图片

RabbitMQ 有几种广播类型

目前有四种类型:direct、fanout、topic、headers。headers匹配AMQP消息的Header而不是路由键,此外headers交换器和direct交换器完全一致,但性能差很多,目前几乎用不到。

  • direct:直连
  • fanout:广播
  • topic:订阅,模糊匹配

RabbitMQ 包含事务功能吗?如何使用?

支持事务

  • 主要对信道(Channel)的设置,主要有以下三种方法:
  • channel.txSelect() 声明启动事务模式
  • channel.txComment() 提交事务
  • channel.txRollback() 回滚事务

RabbitMQ 的事务在什么情况下是无效的?

RabbitMQ的事务在autoAck=true,也就是自动消费的时候,事务无效

Kafka 可以脱离 zookeeper 单独使用吗?为什么

  • 之前版本不能脱离使用。因为Kafka使用Zookeeper管理和协调Kafka的节点服务器
  • 新版本支持独立使用,还在测试阶段

Kafka 有几种数据保留的策略

有两种数据保存策略:按照过期时间保留,按照存储的消息大小保留

Kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 Kafka 将如何处理?

Kafka会执行数据清理工作,时间和大小不论达到哪个条件,都会清理数据

Kafka 的分区策略有哪些?

4种分区策略

  • 给定分区号,直接将数据发送指定的分区里面去
  • 没给分区号,给定数据的key值,通过key取上hashCode进行分区
  • 没给分区号,没给key值,直接轮训进行分区
  • 自定义分区

什么情况会导致 Kafka 运行变慢?

  • CPU性能瓶颈
  • 磁盘读写瓶颈
  • 网络瓶颈

使用 Kafka 集群需要注意什么?

  • 集群的数量不是越多越好,最好不超过7个,因为节点越多,消息复制需要的时候就越长,整个集群的吞吐量就越低
  • 集群数量最好是单数,因为超过一般故障集群就不能用了,设置单数容错率更高

你可能感兴趣的:(面试题,rabbitmq,kafka,java,消息队列,面试)