新闻是有分量的

新濠娱乐送38

2019-05-01 10:34栏目:新闻

原标题:面试一线互联网大厂?那这道题目你必须得会!

作者 | 中华石杉

责编 | 伍杏玲

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

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

这是面试官在考察一个高级以上的Java工程师的系统设计能力。

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

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

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

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

为什么这么说呢?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

建议大家可以去研究Kafka底层的文件存储原理,那是非常经典的高性能高并发消息中间件存储架构的实现。

可以参考一下RabbitMQ和Kafka的官网,研究一下不同中间件的消费模型是怎么做的。

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