作者 | 中华石杉

责编 | 伍杏玲

本文经授权转载自石杉的架构笔记

这篇文章简单给大家来聊一个互联网大厂的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)

5G之后,中国的人工智能发展趋势如何?

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

【END】

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍CSDN新成员:极客宝宝(ID:geek_baby)

戳他了解更多↓↓↓

 热 文 推 荐 

☞工作 10 年,月薪过万者不足三成,程序员却笑了!

☞红帽取代 Oracle,接管 OpenJDK 8 和 OpenJDK 11 | 极客头条

☞44 岁的微软下一步是什么?

☞天才程序员:25 岁进贝尔实验室,32 岁创建信息论

☞ 扎心!工作 10 年,月薪过万者不足三成,程序员却笑了

☞6张图告诉你, 区块链的未来在哪里

☞我们应聘BAT等互联网公司,关于Spring到底需要掌握什么?

☞如何确定最佳训练数据集规模?6 大必备“锦囊”全给你了

☞ 她说:为啥程序员都特想要机械键盘?这答案我服!

System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"

你点的每个“在看”,我都认真当成了喜欢

面试一线互联网大厂?那这道题目你必须得会!相关推荐

  1. 阿里p7大手子测试笔记:一线互联网大厂面试问题吃透,巧过面试关

    前言 金九银十刚过去,有一部分朋友在这期间肯定经历了一番大厂面试的洗礼,不知道大家是经受住了考验如愿以偿了,还是折戟沉沙无功而返呢? 身边已经有技术大佬顺利通过了阿里P6/P7的面试,在30岁之前成功 ...

  2. 金三银四跳槽涨薪,对标一线互联网大厂面试题

    声明,本人能力有限,只是列出来参考,不对之处欢迎指正. 前言 跳槽时时刻刻都在发生,没必要局限在金三银四,金九银十.但金银月的确让我学到很多. 今天给大家分享下我刚过不久的金三银四跳槽中整理的Java ...

  3. 2020一线互联网大厂面经集——阿里篇「1」

    2020一线互联网大厂面经集--阿里篇「1」 1.1.1 如何实现一个高效的单向链表逆序输出? 1.1.2 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位 1 ...

  4. 离开一线互联网大厂的年轻人在想什么?

    作者 | 迷茫的小白 责编 | 王晓曼 出品 | 程序人生(ID:coder_life) 笔者是2021届某一线互联网大厂的暑期实习生,岗位是iOS开发,进来的时候是零基础.然而近期迷茫的我,放弃了转 ...

  5. 秋招来袭,想学习Java进大厂的小伙伴,这7点武林秘籍一定要点开看看!(附一线互联网大厂MySQL面试高频考点)

    转眼间六月已经过了十天了.六月虽是盛夏,但秋招也不远了.提早做好准备才能在实战中游刃有余. 今天整理更新一篇Java学习分阶段路线攻略.希望能给大家一些启发,找到一条属于自己的学习线路. 本文为转载. ...

  6. 想进BAT一线互联网大厂,该怎么准备技术面试?一位6年老Android的面经总结(附300+面试题)

    前言 准备面试其实已经准备了挺久了,当时打算面试准备了差不多以后,跟公司谈谈涨薪的事情,谈不拢的话,就年后直接找其他的公司.谁想到婚假还没休完,老板就在公司宣布了撤出上海的决定,愿意去深圳的就去,不愿 ...

  7. 太全了,一线互联网大厂都在用的Android UI框架完全解析,拿去吧你

    在学习Android过程中,会使用到很多UI框架,而使用时对框架的实现方式应有一定的了解,这个过程最好的方式就是阅读源码,学习大厂的使用方法.但UI框架很多,不时会有新的出现,而且对一些通用框架来说, ...

  8. 【面试分享】GitHub上Star大佬是如何一举拿下7家一线互联网大厂的Offer

    本文作者是牛客网知名大佬 CyC2018,在他的 GitHub 有一个高达 40K Star 的技术仓库(在所有仓库中排名前五十),可以说在开源项目方面是一骑绝尘的牛人.今天我们分享一下他的求职经历. ...

  9. 一线互联网大厂中高级Android面试真题收录!大厂直通车!

    行业激烈变化时,恰恰是机会最多的时候 坦白讲,许多人骨子里害怕变化和竞争. 其实大可不必. 一来,怕也没用嘛.二来,变化越快,组合要素增加了,意味着新的工作机会越多. 就像传统媒体VS新媒体. 放在1 ...

最新文章

  1. 端口扫描程序nmap使用详解
  2. 【微软公有云系列】(七)SCVMM模板--Windows server 2012 虚拟机模板
  3. 通配符(WildCard)的使用
  4. 【PP操作手册】成品入库和订单报工
  5. 一款社区论坛小程序源码
  6. 怀念本科时代----科学入门的导师肖建华老师
  7. Tomcat version 5.5 only supports J2EE 1.2, 1.3, and 1.4 Web modules
  8. 问题三十四:怎么用ray tracing画任意长方体(generalized box)
  9. JavaSE教程_1 安装jdk
  10. Spring Security 之多AuthenticationProvider认证模式实现
  11. 服务网与Kubernetes上的Istio分5步
  12. ASP.NET 路由实现页面静态化(附在线Demo和Source)
  13. PCS7 数据库解析
  14. html中class类怎么写,HTML class 属性 | 菜鸟教程
  15. ueedit富文本编辑器的使用
  16. Winsock 的初始化
  17. GeneXus的科技基础(GeneXus背后的理论)
  18. 南京大学java机试,2019南京大学计算机本科生开放日机试
  19. 新手入门 | photoshop基础教程
  20. 西门子S71200自建数据类型统计设备OEE的方法

热门文章

  1. 论文阅读:Pyramidal Feature Shrinking for Salient Object Detection
  2. 在VMware中的Ubuntu虚拟机安装open-vm-tools调整屏幕可以复制粘贴
  3. 矩池云升级JupyterLab版本教程
  4. 雷达数据处理及应用第三版 pdf_数字阵列雷达:零中频接收机的优缺点
  5. leetode题库5438--制作 m 束花所需的最少天数
  6. C语言作业 – 数组排序算法可视化
  7. 权限不足_十分钟掌握Linux文件属性及权限操作,不再担心权限不足!
  8. 云原生数据编排厂商Alluxio获5000万美元C轮融资
  9. 揭秘 AWS 基础架构底层运维和构建之道!
  10. 小米、QQ等8款手机浏览器发布自查整改公告;AMD宣布收购赛灵思;​TypeScript 4.0.5发布|极客头条