想去BAT、美团、京东和字节面试?那你必须懂他们的面试套路!

2023-11-08

V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

目录:

  1. 面试官为啥要出这样一个开放式问题
  2. 生产消费模型及核心数据结构
  3. 支撑TB级数据写入的分布式架构
  4. 数据宕机场景下的高可用架构
  5. 支持数据不丢失的ack机制
  6. 最后的总结

1、面试官为啥要出这样一个开放式问题

这篇文章简单给大家来聊一个互联网大厂的Java面试题:如果让你设计一个消息中间件,你会怎么做

其实这个问题之前大致给大家聊过,本质就是面试官在考察一个高级以上的Java工程师的系统设计能力。

给你一个平时大家都常用的一个消息中间件作为命题,让你现场开放式发挥,立马开动脑筋说说如果让你来设计这么一个消息中间件。

让你从整体架构,核心流程,数据结构,等各个层面来考虑,你会如何完成这个设计?

其实任何一个面试官都应该知道,如果一个人没有真的做过消息中间件开发的话,是不太可能在短时间内,瞬间给出一套特别靠谱的架构设计方案的。

但是用这个题目作为一个开放式命题,他最大的好处,就是可以尽可能的挖掘出一个候选人的较为真实的系统设计的能力和功底。


为什么这么说呢

因为如果面试的时候很多东西都是一些常见的技术问题,比如说:

  • 消息中间件如何保证数据不丢失?
  • 聊聊Elasticsearch的架构原理以及性能优化?
  • 你们公司的微服务架构整体如何设计的?

这些问题相对来说都是比较固定的一些问题。

所谓固定的问题,就是只要你花费一些时间去学习了相关的技术,或者是在自己所在的公司确实有过一些落地的经验,通常来说回答出这些问题就不是太大的问题了。

但是这些问题都不够开放,如果两个候选人都同样具备常规问题的回答能力,那么此时通过一道有深度的开放式问题,就可以把几个人里迅速拉开差距,找出来到底谁的技术功底更加深厚,谁的架构设计能力更加强。

那么本文就从各个角度来引导大家去思考一下,假如让你回答这个问题,你可以从哪些方面入手来现场做一些考虑和回答?


2、生产消费模型以及核心数据结构

首先第一个点,消息中间件本身要做的就是可以允许有人来生产消息,还可以允许有人来消费这个消息。

那么这里要考虑的第一个点,就是消息中间件自己本身的核心数据结构。

也就是说,如果有人生产了消息,你作为一个消息中间件,应该如何存储这个数据

你会存储在内存里呢?还是存储在磁盘文件里呢?或者两者都同时共存?

可以先允许数据写入内存作为一个缓冲,然后每隔几秒再把数据刷入磁盘文件中?数据刷入磁盘文件之后,这个磁盘文件有多少个?

你总不能一直搞一个磁盘文件来存放所有的数据吧?那么按照什么样的规则对磁盘文件做一个拆分?

数据写入磁盘文件之后,是不是要有相应的一些metadata来标识这个数据的具体信息?比如这个数据的offset偏移量,或者是一个内置的唯一id?


接着现在数据是被存储在磁盘文件里了,那么此时你如何把数据投递到下游的消费者里去呢?

你的消费模型是什么样的?比如说一个queue里的数据,是会均匀分配给消费者的各个实例呢?还是会怎么做呢?

在这里给大家做一个提示,建议大家可以去研究研究比如kafka底层的文件存储原理,那是非常经典的高性能高并发消息中间件存储架构的实现。

另外就是可以参考一下rabbitmq和kafka的官网,研究一下不同中间件的消费模型是怎么做的。

在这里插入图片描述

3、支撑TB级数据写入的分布式架构

接着你应该考虑第二个大的问题,就是你的消息中间件肯定会遇到每天TB级海量数据高并发高吞吐写入的场景。

此时,你的消息中间件的架构如何支撑呢

所以这里你就要考虑一下,你的数据是不是要分布式的存储

比如说假如你一天写入几百TB的数据,那不可能都放在一台机器上吧?所以数据的分布式存储是不是你要考虑的另外一个很重要的问题?

你是不是要考虑把一个大的数据集合做分片存储,比如说分成N片数据,每个数据分片放在一台机器上,这样就可以充分利用多台机器的资源来承载TB级的大量数据了。


此外你还需要考虑,你的数据分片是不是要可以支撑扩容?

比如你一开始设置的分片数量是10个,存在10台机器上。结果现在发现10台机器都扛不住了,需要扩容到20个分片,放在20台机器上才可以。

那你是不是要支持数据分片的扩容以及自动数据负载均衡迁移?也就是10个分片的数据自动均匀分配给扩容后的20个分片。

所以这种分布式以及可伸缩的架构,是另外一个非常核心的点。

我个人同样比较建议大家研究一下kafka在这块的架构设计,非常的优秀,采用了partition的概念实现数据分片,支持分布式的数据存储,而且还支持动态扩容。
在这里插入图片描述

4、数据宕机场景下的高可用架构

大家此时就要考虑另外一个问题了,就是一旦数据分布式存储之后,那么每台机器上都有一部分数据。

万一这台机器宕机了呢?那么数据是不是就丢失了?

是的!所以高可用的架构在这里就必须考虑到了。

一般分布式系统实现高可用架构,都是采用多副本冗余机制

也就是说一份数据在多台机器上都搞一个副本,这样任何一台机器宕机了,数据肯定不会丢失,你还可以继续使用其他机器上的副本数据来支持生产和消费。

同样建议大家,研究一下kafka的多副本冗余机制,他的每个partition数据分片都是有多个副本的,任何一台机器宕机,丢失一个数据分片,还有其他机器上的副本分片在,可以支持数据不丢失。

在这里插入图片描述

5、支持数据不丢失的ack机制

最后再考虑一个问题,你的消息中间件肯定是要支持数据绝对不丢失的吧?

那么你必须要支持生产端和消费端的ack机制,这块内容我们之前都用多篇文章讲解过里面的具体的原理,大家可以参考一下:

  • 每次都碰到面试官问我如何保证Kafka不丢失消息,快哭了!
  • 大牛总结超详细的RabbitMQ入门,看这篇文章就够了!

在这里你必须考虑两块ack机制,一个是生产端,一旦投递了消息,必须要求他将数据比如写入多个副本之后,才返回一个ack回调响应。

否则要是一直没收到ack的话,就需要重发一条消息过去,保证生产投递成功。


另外一个是消费端,一旦消费处理成功一条消息了,必须返回一个ack给消息中间件,然后消息中间件才能删除这条消息。

否则一旦消费者宕机,就必须重发这条消息给其他的消费者实例,保证消息一定会被处理成功。

这块如果大家不清楚,建议一定重看之前的系列文章,我们基于rabbitmq来阐述的这个数据不丢失的全链路ack机制。

在这里插入图片描述

6、最后的总结

这种开放式面试题,牵扯了大量的底层细节和架构思想,非常区分不同人的技术水平。如果你往简单了回答,就本文涉及到的一些东西简单说一说,基本也能过关。

但是如果你想技压群雄,就必须要根据本文每个部分提示的东西,真的去对各种MQ中间件的底层源码进行深入的研究,然后才能在回答这个问题的时候,展现出“碾压其他人”的技术功底和架构实力。

V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

另外推荐儒猿课堂的1元系列课程给您,欢迎加入一起学习~

互联网Java工程师面试突击课(1元专享)

SpringCloudAlibaba零基础入门到项目实战(1元专享)

亿级流量下的电商详情页系统实战项目(1元专享)

Kafka消息中间件内核源码精讲(1元专享)

12个实战案例带你玩转Java并发编程(1元专享)

Elasticsearch零基础入门到精通(1元专享)

基于Java手写分布式中间件系统实战(1元专享)

基于ShardingSphere的分库分表实战课(1元专享)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

想去BAT、美团、京东和字节面试?那你必须懂他们的面试套路! 的相关文章

  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • Guice 忽略注入构造函数参数上的 @Nullable

    我正在使用 Guice v 3 0 并且有一个值被注入到构造函数中 该值可以为 null 因此我在构造函数中使用 Nullable 来自 javax annotations 注释了该参数 public MyClass Parameter1
  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • Java:从集合中获取第一项

    如果我有一个集合 例如Collection
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • Eclipse - 安装新的 JRE (Java SE 8 1.8.0)

    我正在尝试安装 Java 8 到目前为止我所做的 安装最新版本的 Eclipse 下载并安装 Java SE 运行时环境 8http www oracle com technetwork java javase downloads jre8
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 浅谈TCP/IP协议

    一 TCP IP协议 TCP 传输控制协议 IP 因特网互联协议 TCP IP 合称网络通讯协议 是Internet最基本的协议 Internet国际互联网络的基础 由网络层的IP协议和传输层的TCP协议组成 TCP IP 定义了电子设备如
  • c++链表对应节点相加

    题目 给定两个链表 分别表示两个非负整数 它们的数字逆序存储在链表中 并且每个节点只存储一个数字 计 算两个数的和 并且返回和的链表头指针 如 输入 3 gt 6 gt 9 2 gt 5 gt 7 输出 5 gt 1 gt 7 gt 1 思
  • 自己动手写线程池——向JDK线程池进发

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Java七大设计原则

    文章目录 一 单一职责原则 1 不遵守单一职责原则 2 遵守单一职责原则 二 接口隔离原则 编辑 三 依赖倒转原则 1 改进前 2 改进后 四 里氏替换原则 五 开闭原则OCP 六 迪米特法则 七 合成复用原则 八 UML类图 一 单一职责
  • form-group 两种常用使用

    用法一 运行结果如下 form group 增加盒子的下边界 form control 充满整个父元素 并且有换行作用 用法二 运行结果如下 control label 元素内实现包含内容右对齐 FR 海涛高软 QQ技术交流群 386476
  • java的反射

    一 反射的定义 基于 JDK8 Oracle官网对反射的解释是本文基于 JDK8 Oracle官网对反射的解释是 反射使 Java 代码可以发现有关已加载类的字段 方法和构造函数的信息 并在安全性限制内使用反射对这些字段 方法和构造函数进行
  • 熵,信息熵,香农熵,微分熵,交叉熵,相对熵

    2019 07 13 https blog csdn net landstream article details 82383503 https blog csdn net pipisorry article details 5169528
  • Java 实现二分法查找

    二分法 public class BinarySearch public static void main String args int array 1 5 8 11 19 22 31 35 40 45 48 49 50 int targ
  • Java面向对象,你真的会用吗?

    就在今天 自己写的一个C 项目 同事说用面向对象的思想写比较好 其实面向对象思想 感觉这个东西谁不知道啊 但是 确实这个程序没有使用 使用的好处是什么呢 又要如何使用呢 这是很值得思考的问题 面向对象简称OO Object Oriented
  • OpenWrt的学习和总结

    OpenWrt的学习和总结 内容目录 1OpenWrt背景知识 2 2OpenWrt 基础知识 2 2 1目录结构 2 2 2扩展软件包feeds 3 2 3OpenWrt SDK 4 2 4固件升级 8 3OpenWrt内部机制 8 3
  • c++涉及继承和虚继承时的内存布局

    原文地址 c 涉及继承和虚继承时的内存布局 作者 风箫夜吟 今天是清明节假期的第二天 天气阴沉 无心于游玩 遂决定宅于实验室 现在来说每天拜读一下大牛的博客已成生活中不可或缺之乐趣 但是俗话说的好 光说不练假把式 今天拜读了浩哥的博客 感触
  • java中filereader使用

    package dadeo import java io FileNotFoundException import java io FileReader import java io FileWriter import java io IO
  • jmeter压测监控服务器

    安装步骤可参考 Windows https www cnblogs com zjn 20161215 p 8652623 html Linux https blog csdn net liuqiuxiu article details 10
  • springboot集成zipkin

    1 下载zipkin 的jar 后台启动 比如127 0 0 1 9411 2 所有的springboot项目 pom xml添加依赖
  • 笔记——输出信息

    Input sensor was set to Monocular Loading ORB Vocabulary This could take a while Vocabulary loaded Camera Parameters fx
  • SpringBoot启动时忽略某些自动配置类

    SpringBoot启动时忽略某些自动配置类 最近业务要求对接数据 需要连接第三方的数据库 但是他们的都是内网 只能通过前置机上部署我们的项目 由于 我们与第三方对接的处理都写在单独的服务里 如果来一个第三方 单独再写一个服务会很麻烦 不好
  • OpenGL 学习笔记(四) 基础纹理

    一 载入纹理 1 从磁盘中载入Targa 文件 GLbyte gltReadTGABits const szFileName GLint iWidth GLint iHeight GLint iComponents GLenum eForm
  • 实测—fft IP核使用(包括ifft的配置使用)

    Vivado xilinx fft9 0 使用笔记 注 仿真实测1024点的转换需要经过1148个时钟周期才能得到转换结果 模块配置信号含义请参考pg109文档手册 写的贼烂会看晕 不详细说明 一 查找fft IP核按如下几图配置可实现正确
  • Model checking Part I

    Model Checking 文章目录 Model Checking 序言 可靠系统开发过程中的主要挑战 设计验证问题 design validation 现有实践方法 模拟和测试 simulation and tesing 本书主题 取代
  • 想去BAT、美团、京东和字节面试?那你必须懂他们的面试套路!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 面试官为啥要出这样一个开放式问题 生产消费模型及核心数据结构 支撑TB级数据写入的分布式架构 数据宕机场景下的高可用架构 支持数据不丢失的ack机制 最后的总结