| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 消息队列经典十连问 -> 正文阅读 |
|
[大数据]消息队列经典十连问 |
整理了十道十分经典的消息队列面试题,看完肯定对面试有帮助的,大家一起加油哈
1. 什么是消息队列你可以把消息队列理解为一个使用队列来通信的组件。它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下: 我们通常说的消息队列,简称MQ(Message Queue),它其实就指消息中间件,当前业界比较流行的开源消息中间件包括: 2. 消息队列有哪些使用场景。有时候面试官会换个角度问你,为什么使用消息队列。你可以回答以下这几点:
2.1 应用解耦举个常见业务场景:下单扣库存,用户下单后,订单系统去通知库存系统扣减。传统的做法就是订单系统直接调用库存系统:
如何解决这个问题呢?可以引入消息队列
2.2 流量削峰流量削峰也是消息队列的常用场景。我们做秒杀实现的时候,需要避免流量暴涨,打垮应用系统的风险。可以在应用前面加入消息队列。 假设秒杀系统每秒最多可以处理 有些伙伴担心这样会出现消息积压的问题,
2.3 异步处理我们经常会遇到这样的业务场景:用户注册成功后,给它发个短信和发个邮件。 如果注册信息入库是30ms,发短信、邮件也是30ms,三个动作串行执行的话,会比较耗时,响应90ms: 如果采用并行执行的方式,可以减少响应时间。注册信息入库后,同时异步发短信和邮件。如何实现异步呢,用消息队列即可,就是说,注册信息入库成功后,写入到消息队列(这个一般比较快,如只需要3ms),然后异步读取发邮件和短信。 2.4 消息通讯消息队列内置了高效的通信机制,可用于消息通讯。如实现点对点消息队列、聊天室等。 2.5 远程调用我们公司基于MQ,自研了远程调用框架。 3. 消息队列如何解决消息丢失问题?一个消息从生产者产生,到被消费者消费,主要经过这3个过程: 因此如何保证MQ不丢失消息,可以从这三个阶段阐述:
3.1 生产者保证不丢消息生产端如何保证不丢消息呢?确保生产的消息能到达存储端。 如果是RocketMQ消息中间件,Producer生产者提供了三种发送消息的方式,分别是:
生产者要想发消息时保证消息不丢失,可以:
3.2 存储端不丢消息如何保证存储端的消息不丢失呢? 确保消息持久化到磁盘。大家很容易想到就是刷盘机制。 刷盘机制分同步刷盘和异步刷盘:
Broker一般是集群部署的,有master主节点和slave从节点。消息到Broker存储端,只有主节点和从节点都写入成功,才反馈成功的ack给生产者。这就是同步复制,它保证了消息不丢失,但是降低了系统的吞吐量。与之对应的就是异步复制,只要消息写入主节点成功,就返回成功的ack,它速度快,但是会有性能问题。 3.3 消费阶段不丢消息消费者执行完业务逻辑,再反馈会Broker说消费成功,这样才可以保证消费阶段不丢消息。 4. 消息队列如何保证消息的顺序性。消息的有序性,就是指可以按照消息的发送顺序来消费。有些业务对消息的顺序是有要求的,比如先下单再付款,最后再完成订单,这样等。假设生产者先后产生了两条消息,分别是下单消息(M1),付款消息(M2),M1比M2先产生,如何保证M1比M2先被消费呢。 为了保证消息的顺序性,可以将将M1、M2发送到同一个Server上,当M1发送完收到ack后,M2再发送。如图: 这样还是可能会有问题,因为从MQ服务器到服务端,可能存在网络延迟,虽然M1先发送,但是它比M2晚到。 那还能怎么办才能保证消息的顺序性呢?将M1和M2发往同一个消费者,且发送M1后,等到消费端ACK成功后,才发送M2就得了。 消息队列保证顺序性整体思路就是这样啦。比如Kafka的全局有序消息,就是这种思想的体现: 就是生产者发消息时,1个 但是这样吞吐量太低,一般保证消息局部有序即可。在发消息的时候指定 5.消息队列有可能发生重复消费,如何避免,如何做到幂等?消息队列是可能发生重复消费的。
如何幂等处理重复消息呢? 我之前写过一篇幂等设计的文章,大家有兴趣可以看下哈:聊聊幂等设计 幂等处理重复消息,简单来说,就是搞个本地表,带唯一业务标记的,利用主键或者唯一性索引,每次处理业务,先校验一下就好啦。又或者用redis缓存下业务标记,每次看下是否处理过了。 6. 如何处理消息队列的消息积压问题消息积压是因为生产者的生产速度,大于消费者的消费速度。遇到消息积压问题时,我们需要先排查,是不是有bug产生了。 如果不是bug,我们可以优化一下消费的逻辑,比如之前是一条一条消息消费处理的话,我们可以确认是不是可以优为批量处理消息。如果还是慢,我们可以考虑水平扩容,增加Topic的队列数,和消费组机器的数量,提升整体消费能力。 如果是bug导致几百万消息持续积压几小时。有如何处理呢? 需要解决bug,临时紧急扩容,大概思路如下:
7. 消息队列技术选型,Kafka还是RocketMQ,还是RabbitMQ先可以对比下它们优缺点:
8. 消息中间件如何做到高可用消息中间件如何保证高可用呢? 单机是没有高可用可言的,高可用都是对集群来说的,一起看下kafka的高可用吧。 Kafka 的基础集群架构,由多个 有些伙伴可能有疑问,每个
直接读 leader 上的数据即可。如何保证高可用的?就是假设某个 broker 宕机,这个broker上的partition 在其他机器上都有副本的。如果挂的是leader的broker呢?其他follower会重新选一个leader出来。 9. 如何保证数据一致性,事务消息如何实现一条普通的MQ消息,从产生到被消费,大概流程如下:
我们举个下订单的例子吧。订单系统创建完订单后,再发送消息给下游系统。如果订单创建成功,然后消息没有成功发送出去,下游系统就无法感知这个事情,出导致数据不一致。 如何保证数据一致性呢?可以使用事务消息。一起来看下事务消息是如何实现的吧。
10. 让你写一个消息队列,该如何进行架构设计?这个问题面试官主要考察三个方面的知识点:
遇到这种设计题,大部分人会很蒙圈,因为平时没有思考过类似的问题。大多数人平时埋头增删改啥,不去思考框架背后的一些原理。有很多类似的问题,比如让你来设计一个 Dubbo 框架,或者让你来设计一个MyBatis 框架,你会怎么思考呢? 回答这类问题,并不要求你研究过那技术的源码,你知道那个技术框架的基本结构、工作原理即可。设计一个消息队列,我们可以从这几个角度去思考:
原文链接:https://juejin.cn/post/7067322260511522823
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 10:28:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |