21 天互联网 Java 进阶面试训练营 (分布式篇)

1.互联网大厂面试要求:技术广度、技术深度、系统设计以及项目经验

假设,咱们团队负责一个系统:Dubbo作为服务框架、MQ(RocketMQ/Kafka)、缓存(redis)、搜索(Elasticsearch)

在互联网那个行业里+非互联网的 IT 公司里,本身是有一套主流技术栈的。

假设,业务发展特别迅猛,需要团队扩招 5 个人进来,此时就要在外面的招聘网站里发布对应的职位 JD,跟猎头合作,捞一些比较合适的人简历进来。

最起码的,你应该去从哪个角度来考察这个候选人呢?职位 JD 要求是工作经验在 3 年 - 5年,有一定的社会工作经验的

1、技术广度考察:

招聘过来一个几年经验的人,就不要再去培养他了,候选人的整个技术栈是比较匹配我们团队的技术栈的

从广度上把各种技术都给他考察一下,尤其是我们团队负责的系统涉及到的技术

Dubbo,熟悉吗?看你的建立之前你们公司也是用的这个服务框架,说一下它的基本工作原理,从服务注册到发现,它是怎么来运行的?你们当时服务注册中心是用的什么技术跟 Dubbo 搭配起来的?

看你简历上,说你们之前的系统里用过 RocketMQ,来聊一聊,先说你们公司当时为什么要用 MQ 呢?MQ是怎么部署的?集群架构?高可用是如何保证的?RocketMQ 的核心架构原理?工作原理?当时有没有考虑过发送到 RocketMQ 里的消息可能会丢失?

缓存(Redis),集群部署,Redis 集群运行原理,Redis 高可用的原理, Redis 单线程高并发的原理,ES分布式架构的原理,一般你们的 ES 是怎么优化性能的?

到此为止,确定,他进来的话,李曼可以上手熟悉你们的架构、系统和代码,技术上不用做特殊的培养,很快可以上手开始干活,基于你们现有的 架构、现有的技术栈,上手就可以开始开发各种业务功能模块。

常见的技术方案也会设计,常见的一些问题可以自己处理,常见的优化可以做

JVM、数据库和并发都是必考的。

我们希望你能够进来之后对 JVM 的基本原理都有一定的了解。如果你负责的一个系统出现了 JVM 的一个问题,比如内存溢出,或者是 GC 频繁的问题,希望你能独立的去分析和解决。

数据库:MySQL 包括事务的原理、索引的原理,常见的 SQL 优化的手段。

并发,本身是属于 Java 编程语言层面的一个基本的功能,本身有一些深度和难度的地方,写出高效的正确的并发程序,线程池、线程安全等方面的内容。集合、锁等等

薪资在 20K 左右,差不多。

2、项目经验

你平时用的各种技术,如何结合业务来进行落地。然后你在项目生产环境中落地一个技术之后,对他进行的生产优化、架构优化、生产实践是怎么来做的?

分库分表,你说你的简历里用过 Sharding-JDBC 来做分库分表

首先给我说说,你们的系统有哪些表,对应的是哪些业务呢?然后告诉我,核心的表每天新增的数据量有多少?目前已经积累了多少数据了?单表还是百万级?你们是什么时候分的表?什么时候分的库?为什么?

在没有分表之前,SQL的性能大概如何?分表之后 SQL 的性能大概如何?分库之前每个数据库服务器上放多少 GB 的数据?

很多同学出去面试,学习了很多的技术,无论是跟着一些视频课程,在线培训课程,或者是网上的博客,或者是一些书,积累了很多的知识,Sharding-JDBC 分库分表基本的原理,常见的分库分表的技术方案

但是呢,这些同学往往是为了面试去猪呢比的一些技术,但是其实从没在自己的项目中实践过,也从没思考过这些技术在自己的项目落地的各种细节应该是如何来进行设计的。

出去面试的时候,往往被面试官一通追问项目的各种细节,然后就直接死了。

3、生产经验

分布式、微服务这块,你说用过网关,网关调研了哪几种技术?对比一下他们的优缺点?最后没你们是怎么进行技术选型的?你们这个系统每天的访问量多高?高峰期 QPS 多高?你们网关要抗多高的 QPS?网关是如何部署的?部署了几台机器?每台机器的配置集合,几个核 CPU,几个GB内存?

你如你的服务里加了一个新的借口,总不能你每次都手动在网关里配置一些新的借口和服务的对应关,网关的动态路由是怎么做的?每次上线服务或者新的接口,跟你的网关动态路由是如何搭配起来的?

线上网关部署的机器在生产环境,你们的访问压力下,平时的高峰期的 CPU 负载如何?有没有考虑过网关的扩容?如果压力过大如何进行扩容?

有没有测算过网关进行请求路由的性能如何?一般一个请求经过网关层的路由对时间的开销大概是多少?

现在的话呢,假设说,网关当时在线上部署之后,生产环境运行的时候有没有遇到过什么问题?比如并发的问题,性能的问题?如果要对生产环境的网关进行高并发、高性能的优化,你们是怎么做的呢?如果要做,你觉得从哪些角度入手可以去做?

总结一下:项目经验+生产经验,薪资是 28k,30k,或者是 32k,高级-资深的工程师,经验 5 年- 8年左右,希望你能够去带一两个小弟,或者是带一个小小组,当一个小小的 team leader

我肯定是希望你能够把生产环境的各种细节都 cover 住;

项目经验,技术在项目中如何落地,各种细节,如果你是一个带几个小弟的资深工程师的话,此时你就必须对你负责的项目进行所有细节的把控。希望你能够结合业务和项目的细节去考虑技术如何落地。

生产经验,把控项目部署后的生产环境里的情况,对各种情况做出对应的举措和优化的手段,全面为自己的项目进行负责。

如果是很多的大厂,哪怕是三五年的经验,或者二三年的经验,也会考虑这块项目经验和生产经验,越是大厂,对你的能力要求就会越高。希望你进来以后越能独当一面,所以就希望你不光知识有技术广度。

4、技术深度

你又没有读过哪些开源项目的源码, RocketMQ、Dubbo 的源码?

如果你精通一些技术的源码的话,为什么会特别的有价值、有竞争力,让面试官更加的倾向于用你?

技术深度决定了你的技术功底,决定了在生产环境随时你的系统使用的各种技术可能会遇到的一些异常或者报错,导致系统挂掉。

Dubbo、RocketMQ、Kafka、ES随时可能有问题,比如说, Dubbo 随时可能报错,RocketMQ 突然异常了无法写入消息,ES突然性能巨慢,一次查询要十几秒的时间。

必须需要哪些精通一些技术源码的同学,现场根据异常去分析技术的源码,从源码级别定位到问题的所在,然后解决问题。

大厂很可能会考察你的技术深度,如果发现你没有什么技术深度,那么可能你就没有太大的竞争优势。

5、系统设计

往简单了说,就是会考察一些问题,比如说让你来设计秒杀系统,设计一个 12306 火车票购票系统,支撑几亿用户买火车票,你会如何设计?让你设计一个微信红包系统,你会如何来考虑?

越是大厂越是对你的能力要求越高,希望你进来以后独当一面,哪怕你就 20k 的薪资,也希望你是进来独当一面的,独立负责一块东西。

独立的设计一个系统,独立的设计一个小的架构,此时就会要求你有一定的独立系统设计的能力,30k,40k的薪资才会考察。

30k,40k 50k 更高的薪资职位,技术专家,架构师,要求你本来在你们公司就负责一大块系统的架构,带了 10 来个小弟,负责了一个大系统。有丰富的大型架构设计的经验,架构设计的方方面面,从理论到深度,再到经验,都很丰富。

2. Java工程师面试突击第一季总结:你离一次成功的面试还差多少?

系统性的分析了一下大厂对一个工程师的要求。数据结构和算法、软素质、工程素养、履历背景、学历、真正在招人的时候,会考虑很多的方面,技术广度、技术深度、项目经验、系统设计、技术上的要求,带团队、管理经验。

发布过:《互联网 Java 工程师面试突击(第一季)》

很多同学的简历上还写着:Spring、SpringMVC、Lucence、Activiti做的项目很多都是那种 OA 系统、财务系统、CRM 系统,工厂管理系统等类似的这样的东西。没有跟上国内主流的技术栈,MQ、消息丢失、消息重复、高可用部署、原理;缓存、数据库和缓存双鞋怎么保证一致性;分布式锁、实现原理;分布式事务的常见方案;Dubbo、Spring Cloud。

突击第一季的定位,就是把常见的互联网技术栈里的技术和主流技术方案给大家分析一下,做一个扫盲,避免说数去面试一问三不知。

数据库原理和优化、JVM 原理和优化、并发的原理和优化

已经帮助了数以千计的同学,不完全统计,从去年到今年,看过面试突击第一季的同学,估算人数在 5000 人以上,帮助大量的同学快速扫盲,积累了很多互联网主流技术栈,出去面试,很多人给我们发感谢信。

我们也收到了很多反馈,还是有很多问题,主要集中在三块:项目经验、生产经验、技术深度。

(1)项目经验:分库分表深挖我的项目细节,死磕到底的架势,最后我直接挂掉了。

(2)生产经验:Spring Cloud Zuul 网关在生产环境中如何进行优化,分布式锁会不会导致并发能力降低,如何优化,分布式事务会不会导致交易 TPS 降低,如何优化,服务注册中心如果发现过慢该如何解决?访问量有多大怎么部署的,需要多少台机器?

(3)技术深度:Kafka基本原理、RocketMQ 基本原理,一问到深度点的东西,比如 Kafka 底层的分布式架构,副本同步机制,推还是拉,生产者底层的网络通信机制。

(4)系统设计: 面试官现场出系统设计问题,让我结合某个业务场景现场设计一个方案或者架构,让我给思路。

3. 《21 天互联网 Java 进阶面试训练营》的课程说明

技术广度的问题不太大,只要面试突击第一季好好看完,把对应的一些技术自己去找一些资料简单学习一下

主要欠缺的地方是:项目经验、生产经验、技术深度、系统设计

我们的课程 6 季,分布式、微服务、海量数据、高性能、高并发、高可用。

==这是第 1 季:分布式==

每一季都是把对应的技术主题中的 相关的技术在项目落地的细节,生产经验,架构经验,技术深度,系统设计,给大家结合很多的案例来进行讲解。

每一季是持续 21 天,三周,每周的周一到周五会更新课程,15天,每天是更新 4 讲内容,每天的内容大概在 1 小时左右,最后总课程时长大概在 1000 分钟左右。

4. 作业:系统分析一下,自己距离大厂 Offer 差在哪里?

结合自身的情况分析一下,结合面试突击第一季的课程,在“狸猫技术窝”公众号的知识店铺里去,在里面会有一个免费的课程,就是面试突击第一季,大家去里面找就可以了。

可以把免费的面试突击第一季和我们先在付费的面试训练营系统同步一起看

技术广度的一些东西,各种技术

(1)自己在技术广度上做的如何?你现在在主流技术栈哪些技术都有一定的了解,包括核心原理和常见技术方案

(2)自己在项目经验和生产经验上做的如何?你会的这些技术,自己在项目中到底用了多少?用的有多复杂?用的时候考虑了哪些项目细节和生产细节?

(3)技术深度,你现在对哪些技术除了核心原理以及基础知识之外,对一些技术的底层的概念和原理有一定的了解

(4)系统设计,你目前自己独立负责过设计的系统和架构有多复杂?如果让你来独立设计秒杀系统、红包系统、12306系统,或者是一些其他大型的架构,你会如何来设计?

能力差距在哪里?肯定会有很多的疑问,第一周是预售周,是除了这 4 讲试看以外,其他的是不更新的,从第一周预售结束之后会开始每日更新,可以把面试突击第一季复习巩固一下,没看过的人正好借着这一周把面试突击第一季看一下。

而且可以对自己的能力模型做一个详细的梳理,看看自己现在能力有多强,差距在哪里?

5. 感受一下 BAT 面试官对分布式技术的十几个面试连环炮!

面试突击第一季总共四五十讲,每个技术专题大概也是有十来讲。

针对面试突击第一季关于分布式这块的内容:

  • 为什么要把系统拆分成分布式的?为啥要用 Dubbo?
  • Dubbo 的工作原理是什么?注册中心挂了可以继续通信吗?
  • Dubbo 都支持哪些通信协议以及序列化协议?
  • Dubbo 支持哪些负载均衡、高可用以及动态代理的策略?
  • SPI是什么意思?Dubbo 的 SPI 机制是怎么玩儿的?
  • 基于 Dubbo 如何做服务治理、服务降级以及重试?

这些问题在面试突击第一季里,我们都讲过了,都是非常简单的一些问题,作为一个合格的工程师,如果你是用了分布式系统架构,也就是把大的系统拆分为了多个子系统,或者多个服务。你肯定会用到一种服务框架, Dubbo 、 Spring Cloud、gRPC、Thritf

你必须对这些服务框架的核心架构原理,有一个认识和了解,服务注册和发现,通信和序列化、负载均衡、扩展机制、请求重试、请求超时等等

==但凡用到分布式系统,你就必定会用到服务框架。==

  • 分布式系统中接口的幂等性该如何保证?比如不能重复扣款?
  • 分布式系统中的接口调用如何保证顺序性?

接口幂等性,分布式系统,如果不保证,是否会发生类似重复下单,重复扣款之类的问题?

  • 如何设计一个类似 dubbo 的 RPC 框架?架构上该如何考虑?

如果面试官自己看过一些 dubbo、 Spring Cloud 的源码,对一款服务框架底层实现原理,有一定的了解和认识,此时如果说他希望能够深入的考察你一下,看看你的水平,这个时候可能会问你这个问题:

  • 说说 Zookeeper 一般都有哪些使用场景?
  • 分布式锁是啥?对比下 Redis 和 ZK 两种分布式锁的优劣?

拆分成了分布式系统个,就说明有很多子系统在同时运作,如果说两个子系统都需要对某个数据资源进行一系列复杂的操作,在复杂操作期间,不能让数据被其他任何人改变,分布式锁,技术实现原理。

  • 说说你们的分布式 session 方案是啥?怎么做的?

前后端分离之后,一般都是前端那边来关心 session 之类的问题,后端来说,玩儿分布式 session 的很少了。

其实分布式系统架构里面最最核心的是:服务框架包括一些底层以及实际实现。

==任何一个分布式系统一定是服务框架 + 服务注册中心 + 网关,这些东西组成一个最最基础的分布式系统需要的东西。==

服务框架 + 服务注册中心 + 网关

  • 了解分布式事务方案吗?你们都咋做的?有啥坑?
Last modification:June 20th, 2021 at 02:53 pm
如果觉得我的文章对你有用,请随意赞赏