面试一线互联网大厂?那这道题目你必须得会!
作者 | 中华石杉
责编 | 伍杏玲
本文经授权转载自石杉的架构笔记
这篇文章简单给大家来聊一个互联网大厂的Java面试题:如果让你设计一个消息中间件,你会怎么做?
这是面试官在考察一个高级以上的Java工程师的系统设计能力。
给你一个平时大家都常用的一个消息中间件作为命题,让你现场开放式发挥,立马开动脑筋说说如果让你来设计这么一个消息中间件。
让你从整体架构、核心流程、数据结构等各个层面来考虑,你会如何完成这个设计?
其实任何一个面试官都应该知道,如果一个人没有真的做过消息中间件开发的话,是不太可能在短时间内,瞬间给出一套特别靠谱的架构设计方案的。
但是用这个题目作为一个开放式命题,他最大的好处,就是可以尽可能的挖掘出一个候选人的较为真实的系统设计的能力和功底。
为什么这么说呢?
因为如果面试的时候很多东西都是一些常见的技术问题,比如说:
- 消息中间件如何保证数据不丢失?
- 聊聊Elasticsearch的架构原理以及性能优化?
- 你们公司的微服务架构整体如何设计的?
这些问题相对来说都是比较固定的一些问题。
所谓固定的问题,就是只要你花费时间去学习了相关的技术,或者是在自己所在的公司确实有过一些落地的经验,通常来说就能回答出这些问题。
但是这些问题都不够开放,如果两个候选人都同样具备常规问题的回答能力,那么此时通过一道有深度的开放式问题,就可以把几个人里迅速拉开差距,找出来到底谁的技术功底更加深厚,谁的架构设计能力更加强。
那么本文就从各个角度来引导大家去思考一下,假如让你回答这个问题,你可以从哪些方面入手来现场做一些考虑和回答?
生产消费模型以及核心数据结构
首先第一个点,消息中间件本身要做的就是可以允许有人来生产消息,还可以允许有人来消费这个消息。
那么这里要考虑的第一个点,就是消息中间件自己本身的核心数据结构。
也就是说,如果有人生产了消息,你作为一个消息中间件,应该如何存储这个数据?
你会存储在内存里呢?还是存储在磁盘文件里呢?或者两者都同时共存?
可以先允许数据写入内存作为一个缓冲,然后每隔几秒再把数据刷入磁盘文件中?数据刷入磁盘文件之后,这个磁盘文件有多少个?
总不能搞一个磁盘文件来存放所有的数据吧?那么按照什么样的规则对磁盘文件做一个拆分?
数据写入磁盘文件之后,是不是要有相应的一些Metadata来标识这个数据的具体信息?比如这个数据的Offset偏移量,或者是一个内置的唯一ID?
接着现在数据是被存储在磁盘文件里了,那么此时你如何把数据投递到下游的消费者里去呢?
你的消费模型是什么样的?比如说一个Queue里的数据,是会均匀分配给消费者的各个实例呢?还是会怎么做呢?
建议大家可以去研究Kafka底层的文件存储原理,那是非常经典的高性能高并发消息中间件存储架构的实现。
可以参考一下RabbitMQ和Kafka的官网,研究一下不同中间件的消费模型是怎么做的。
支撑TB级数据写入的分布式架构
接着考虑第二个大的问题,消息中间件肯定会遇到每天TB级海量数据高并发高吞吐写入的场景。那么消息中间件的架构如何支撑呢?
这里就要考虑一下,数据是不是要分布式的存储?
比如说假如一天写入几百TB的数据,那不可能都放在一台机器上吧?所以数据的分布式存储是不是你要考虑的另外一个很重要的问题?
是不是要考虑把一个大的数据集合做分片存储,比如说分成N片数据,每个数据分片放在一台机器上,这样就可以充分利用多台机器的资源来承载TB级的大量数据了。
此外还需要考虑,数据分片是不是要可以支撑扩容?
比如一开始设置的分片数量是10个,存在10台机器上。结果现在发现10台机器都扛不住了,需要扩容到20个分片,放在20台机器上才可以。
是不是要支持数据分片的扩容以及自动数据负载均衡迁移?也就是10个分片的数据自动均匀分配给扩容后的20个分片。
所以这种分布式以及可伸缩的架构,是另外一个非常核心的点。
我个人同样比较建议大家研究一下Kafka在这块的架构设计,非常的优秀,采用了Partition的概念实现数据分片,支持分布式的数据存储,而且还支持动态扩容。
数据宕机场景下的高可用架构
大家此时就要考虑另外一个问题了,就是一旦数据分布式存储之后,那么每台机器上都有一部分数据。
万一这台机器宕机了呢?那么数据是不是就丢失了?
所以高可用的架构就必须考虑到了。
一般分布式系统实现高可用架构,都是采用多副本冗余机制。
也就是说一份数据在多台机器上都搞一个副本,这样任何一台机器宕机了,数据肯定不会丢失,你还可以继续使用其他机器上的副本数据来支持生产和消费。
同样建议大家,研究一下Kafka的多副本冗余机制,他的每个Partition数据分片都是有多个副本的,任何一台机器宕机,丢失一个数据分片,还有其他机器上的副本分片在,可以支持数据不丢失。
支持数据不丢失的ACK机制
最后再考虑一个问题,消息中间件肯定是要支持数据绝对不丢失的吧?
那么你必须要支持生产端和消费端的ACK机制,在这里你必须考虑两块ACK机制,一个是生产端,一旦投递了消息,必须要求他将数据比如写入多个副本之后,才返回一个ACK回调响应。
否则要是一直没收到ACK的话,就需要重发一条消息过去,保证生产投递成功。
另外一个是消费端,一旦消费处理成功一条消息了,必须返回一个ACK给消息中间件,然后消息中间件才能删除这条消息。
否则一旦消费者宕机,就必须重发这条消息给其他的消费者实例,保证消息一定会被处理成功。
这块如果大家不清楚,建议一定重看之前的系列文章,我们基于RabbitMQ来阐述的这个数据不丢失的全链路ACK机制。
这种开放式面试题,牵扯了大量的底层细节和架构思想,非常区分不同人的技术水平。如果你简单回答,就本文涉及到的一些东西简单说一说,基本也能过关。
但是如果你想技压群雄,就必须要根据本文每个部分提示的东西,真的去对各种MQ中间件的底层源码进行深入的研究,然后才能在回答这个问题的时候,展现出“碾压其他人”的技术功底和架构实力。
祝你面试成功!
作者简介:中华石杉,十余年BAT架构经验,倾囊相授。
公众号:石杉的架构笔记(id:shishan100)
【END】
相关文章
-
最宅寒假,B站起飞?
-
关店、罚款、股价暴跌,苹果如何挽回颓势?
-
深度资讯|搜狗依旧是御用搜索引擎,微信打的什么算盘?
-
亚马逊、eBay等电商平台虚假评论泛滥,每条评论成本6美元
-
郭明錤:5G版iPhone11s金属中框/机壳规格将升级
-
彭博社剧透:苹果多款新品开发中!iPhone12或配激光雷达
-
腾讯如何一步步成为了步步高的「红颜知己」?
-
看了航天女神王亚平的枕边人,终于懂得什么才是最高级的婚姻
-
夸夸群的火爆皆有来处,下一代圈子社交产品在哪里?
-
腾讯音乐娱乐集团TMElive大陆独家呈现陈奕迅慈善音乐会
-
涉爆案件刑侦专家、桥梁建筑女焊工,他们是新时代的平凡英雄
-
心跳源计划剧情介绍心跳源计划更新时间
-
中国移动咪咕打造全球首场5G+真4K排球赛事直播,颠覆体育视听体验
-
字节跳动卖车特斯拉第二工厂选址不实|封面天天见·封火轮
-
聊天不一定要用微信,今日头条即将推出的“飞聊”了解一下?
-
要搞明白腾讯要做的产业互联网是什么,出行可能是一个适合了解的入口
-
游戏直播天花板将至!虎牙直播募资5.5亿美元,催肥电竞内容生态
-
人民日报批弹窗广告,弹窗广告这么多到底是谁的错?
-
下个沃尔玛?500强排名比阿里高43位!京东真的恢复元气了吗?
-
汇通达徐秀贤:构建全产业链平台促进农村数字化建设
-
又一暴利行业兴起?内行人:当下看不起,以后想进或来不及
-
公安部严打自媒体“网络水军”违法犯罪;《复联4》发布首款预告片;Facebook因数据问题被罚款 | 猬报
-
审美意识觉醒,8090后开始为室内设计买单
-
扣留孟晚舟 美国真正怕的是什么?
-
PC话你知|首个虚拟大学生入学清华/神舟十二号载人飞船出征
-
盒马招聘剥虾师,宗庆后退休倒计时,视觉中国否认恢复上线|天下网事4.22
-
字节跳动社交APP飞聊上线凌晨遭微信全面封杀
-
《沙丘》《007》再好看,观众也不想为3D买单了
-
8点1氪|华为P40系列发布,售价799欧元起;微信分期消费贷产品“分付”上线;寒武纪科创板上市申请获受理