前言

当你准备跳槽面试的时候,明明只是一份15K的工作,却问你会不会多线程,懂不懂高并发,火箭造得让你猝及不防,结果就是两个字——凉凉!而在如今的市场,什么多线程、高并发、分布式、负载均衡、集群、微服务等等等等,都可说是Java高级后端开发求职的必备技能。

2021的春招可以说也是完美收官,前段时间收到字节跳动的面试邀请,虽有点震惊,但却依旧保持平常心去对待,结果一不小心就吊打了面试官

分布式系统特性与衡量标准

透明性:使用分布式系统的用户并不关心系统是怎么实现的,也不关心读到的数据来自哪个节点,对用户而言,分布式系统的最高境界是用户根本感知不到这是一个分布式系统

可扩展性:分布式系统的根本目标就是为了处理单个计算机无法处理的任务,当任务增加的时候,分布式系统的处理能力需要随之增加。简单来说,要比较方便的通过增加机器来应对数据量的增长,同时,当任务规模缩减的时候,可以撤掉一些多余的机器,达到动态伸缩的效果

可用性与可靠性:一般来说,分布式系统是需要长时间甚至7*24小时提供服务的。可用性是指系统在各种情况对外提供服务的能力,简单来说,可以通过不可用时间与正常服务时间的必知来衡量;而可靠性而是指计算结果正确、存储的数据不丢失。

高性能:不管是单机还是分布式系统,大家都非常关注性能。不同的系统对性能的衡量指标是不同的,最常见的:高并发,单位时间内处理的任务越多越好;低延迟:每个任务的平均时间越少越好。这个其实跟操作系统CPU的调度策略很像

一致性:分布式系统为了提高可用性可靠性,一般会引入冗余(复制集)。那么如何保证这些节点上的状态一致,这就是分布式系统不得不面对的一致性问题。一致性有很多等级,一致性越强,对用户越友好,但会制约系统的可用性;一致性等级越低,用户就需要兼容数据不一致的情况,但系统的可用性、并发性很高很多。

组件、理论、协议

假设这是一个对外提供服务的大型分布式系统,用户连接到系统,做一些操作,产生一些需要存储的数据,那么在这个过程中,会遇到哪些组件、理论与协议呢

用一个请求串起来

用户使用Web、APP、SDK,通过HTTP、TCP连接到系统。在分布式系统中,为了高并发、高可用,一般都是多个节点提供相同的服务。那么,第一个问题就是具体选择哪个节点来提供服务,这个就是负载均衡(load balance)。负载均衡的思想很简单,但使用非常广泛,在分布式系统、大型网站的方方面面都有使用,或者说,只要涉及到多个节点提供同质的服务,就需要负载均衡。

通过负载均衡找到一个节点,接下来就是真正处理用户的请求,请求有可能简单,也有可能很复杂。简单的请求,比如读取数据,那么很可能是有缓存的,即分布式缓存,如果缓存没有命中,那么需要去数据库拉取数据。对于复杂的请求,可能会调用到系统中其他的服务。

承上,假设服务A需要调用服务B的服务,首先两个节点需要通信,网络通信都是建立在TCP/IP协议的基础上,但是,每个应用都手写socket是一件冗杂、低效的事情,因此需要应用层的封装,因此有了HTTP、FTP等各种应用层协议。当系统愈加复杂,提供大量的http接口也是一件困难的事情。因此,有了更进一步的抽象,那就是RPC(remote produce call),是的远程调用就跟本地过程调用一样方便,屏蔽了网络通信等诸多细节,增加新的接口也更加方便。

一个请求可能包含诸多操作,即在服务A上做一些操作,然后在服务B上做另一些操作。比如简化版的网络购物,在订单服务上发货,在账户服务上扣款。这两个操作需要保证原子性,要么都成功,要么都不操作。这就涉及到分布式事务的问题,分布式事务是从应用层面保证一致性:某种守恒关系。

上面说道一个请求包含多个操作,其实就是涉及到多个服务,分布式系统中有大量的服务,每个服务又是多个节点组成。那么一个服务怎么找到另一个服务(的某个节点呢)?通信是需要地址的,怎么获取这个地址,最简单的办法就是配置文件写死,或者写入到数据库,但这些方法在节点数据巨大、节点动态增删的时候都不大方便,这个时候就需要服务注册与发现:提供服务的节点向一个协调中心注册自己的地址,使用服务的节点去协调中心拉取地址。

从上可以看见,协调中心提供了中心化的服务:以一组节点提供类似单点的服务,使用非常广泛,比如命令服务、分布式锁。协调中心最出名的就是chubby,zookeeper。

回到用户请求这个点,请求操作会产生一些数据、日志,通常为信息,其他一些系统可能会对这些消息感兴趣,比如个性化推荐、监控等,这里就抽象出了两个概念,消息的生产者与消费者。那么生产者怎么讲消息发送给消费者呢,RPC并不是一个很好的选择,因为RPC肯定得指定消息发给谁,但实际的情况是生产者并不清楚、也不关心谁会消费这个消息,这个时候消息队列就出马了。简单来说,生产者只用往消息队列里面发就行了,队列会将消息按主题(topic)分发给关注这个主题的消费者。消息队列起到了异步处理、应用解耦的作用。

上面提到,用户操作会产生一些数据,这些数据忠实记录了用户的操作习惯、喜好,是各行各业最宝贵的财富。比如各种推荐、广告投放、自动识别。这就催生了分布式计算平台,比如Hadoop,Storm等,用来处理这些海量的数据。

最后,用户的操作完成之后,用户的数据需要持久化,但数据量很大,大到按个节点无法存储,那么这个时候就需要分布式存储:将数据进行划分放在不同的节点上,同时,为了防止数据的丢失,每一份数据会保存多分。传统的关系型数据库是单点存储,为了在应用层透明的情况下分库分表,会引用额外的代理层。而对于NoSql,一般天然支持分布式。

一个简化的架构图

下面用一个不大精确的架构图,尽量还原分布式系统的组成部分(不过只能体现出技术,不好体现出理论)

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

请点赞后,戳这里,免费获取!

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

620977450638)]

[外链图片转存中…(img-dRHaqRoD-1620977450638)]

[外链图片转存中…(img-C1d76oIw-1620977450639)]

从草根到百万年薪程序员的十年风雨之路,实战解析相关推荐

  1. 从草根到百万年薪程序员的十年风雨之路,吊打面试官系列!

    开头 大家好,我是G哥,目前人在荆州办事,但是干货还是要安排上! 国外有一个爆火的开发人员学习路线,目前已经在 Github收获了 131 k+ star,Star 数量在 Github 所有仓库中排 ...

  2. 从草根到百万年薪程序员的十年风雨之路,使用指南

    前言 文章篇幅较长,建议耐心食用,相信对你有帮助.码字不易,如果有误,欢迎指出. 前部分是面试经历,后部分是附带的问题笔记/推荐回答/书籍. 我的微信小号有一组特殊的朋友.他们从 CSDN上看到我之前 ...

  3. 字节跳动面试:从草根到百万年薪程序员的十年风雨之路,成功收获美团,小米安卓offer

    程序员与别的专业有所不同,其他专业都是越老越香,而程序员却是一个例外,因为计算机技术更新太快,而且工作强度很大,因此大部分程序员只会写 3 年代码.3 年后要不晋升做项目经理,要么转行,个别研究所除外 ...

  4. 从草根到百万年薪程序员的十年风雨之路,醍醐灌顶!

    导语 回首向来萧瑟处,归去,也无风雨也无晴. 我一哥们也是做Java开发,暂且先叫他峰哥吧,到今年已经入行6年了,每天还是写一些业务代码,至今还是个单身狗,愁的头发真的都快谢顶了. 虽然峰哥每天做着C ...

  5. 安卓性能优化面试,从草根到百万年薪程序员的十年风雨之路

    前言 先简单交代一下背景吧,本人毕业于某不知名985的本硕,17年毕业加入阿里,今年下半年跳槽到了头条,一直从事后端研发相关的工作. 之前没有实习经历,算是两年半的工作经验吧.这两年半之间完成了一次晋 ...

  6. 从草根到百万年薪程序员的十年风雨之路,细节爆炸

    前言 过去十多年互联网产业的高速发展,在给社会带来深刻变革的同时,也催生了服务架构的演进:从传统的单体应用到面向服务的SOA,再到现今主流的微服务架构,而 Apache Dubbo就是微服务领域中的先 ...

  7. 从草根到百万年薪程序员的十年风雨之路,年薪50W

    前言 最近有很多朋友向我求教经验,因为我自己工作相对于稳定,在这里给大家分享一个粉丝朋友的经历,他作为一个曾经的菜鸡面试者,在不断的失败中成长,最终斩获了多份offer,因此特别想在此分享一下他的面试 ...

  8. 涨知识!从草根到百万年薪程序员的十年风雨之路,搞懂这些直接来阿里入职

    前言 找工作还是需要大家不要紧张,有我们干这一行的接触人本来就不多 难免看到面试官会紧张,主要是因为怕面试官问的问题到不上来,那时候不要着急 ,答不上了的千万不然胡扯一些,直接就给面试官说这块我还没接 ...

  9. 【转载】从草根到百万年薪程序员的二十年风雨之路

    在写这篇文章之前,该用什么样的标题,我犹豫不定,草根?百万年薪程序员?会不会被人当成标题党.二十年来,我所见过的草根程序员很多,优秀的草根程序员也不少.人与人之间的差别其实很小,很多人因为年少不懂事或 ...

最新文章

  1. 别再乱打日志了,这样才是定位 bug 打日志的方式!
  2. python 给字典排序
  3. FD.io/VPP — VPP 的实现原理解析
  4. PMCAFF微课堂 「已结束」| 京东核心团队揭秘:业务增长10倍背后的敏捷开发秘籍
  5. Google准备开始新一年的大扩张
  6. matlab张量工具初步
  7. 前端学习(2645):懂代码之header表头页之未读消息
  8. 会议交流 | 最新NLP核心技术与前沿实践分享!
  9. 去除小圆点_去除li小圆点以及解决其空格问题
  10. 飞鸽传书的一个美丽的神话
  11. 计算机管理员四级,计算机四级基本知识点
  12. RDS数据库通过内网导出到其他RDS实例和ESC上的MYSQL数据库(新手运维)
  13. java语法基础总结,顺利拿到offer
  14. [leetcode]1375. 灯泡切换器III
  15. Python爬虫之堆糖网图片(二)
  16. 深入理解B/S与C/S架构
  17. 数值卡,让数据可视化玩出新花样丨三叠云
  18. 【Echarts】Echarts给title添加背景图片
  19. 面向对象分析与设计——ATM系统词汇表
  20. php集成环境和自己配置的区别,php集成环境、php绿色集成环境、php独立安装版环境这三者的区别

热门文章

  1. 常用Word页码设置大全
  2. 纯CSS实现水波纹效果
  3. 国内在线漫画快速发展,快看、Bilibili布局海外,国漫出海正当时
  4. 现在还能炒黄金吗,黄金市场有哪些机遇与挑战?
  5. arp miss攻击_S6700交换机出现大量arp-miss情况
  6. CPU Cache 知识详解之Cache_Miss与替换策略(中)
  7. 鸟哥推荐php书籍,好书推荐(PHP方向)
  8. RT-Thread 使用FAL多字节读写FLASH
  9. 微信小程序提示db.RegExp is not a function(已解决)附加代码
  10. 单片微型计算机实验指导,《单片微型计算机与接口技术》实验指导书..doc