04谈谈你对分布式的理解,为什么引入分布式?

引言

刚刚毕业第一份工作,没接触过分布式微服务相关的知识,后来换工作才了解到这些,面试官看了我简历里写了分布式相关,就开始揪住这个问题问,虽然一知半解地说了点,但是面试官明显不满意,没抓住要点,因此关于理论概念,还是要好好掌握总结的。

划重点:

  1. 真正了解分布式系统的概念,日后工作中具有分布式系统设计思想。
  2. 能否在设计中对系统稳定性方面考虑周全。
  3. 能构建高 QPS 健壮的系统架构。

1. 面试官:那谈谈你对分布式系统的理解

问题分析:

各种分布式框架层出不穷,Spring Cloud,阿里的 Dubbo,无论使用哪一个,原理都相同,考察下基本概念掌握的如何。

我:

什么是分布式系统:

为了解决传统单体服务架构带来的各种问题,代码数量庞大,迭代测试维护困难,可能因为一处改动测试不到位造成整个服务瘫痪等问题,分布式系统就是将一个大的服务拆分成几十个甚至上百个微小的服务。如果把单体架构服务器比做篮子,那代码就是鸡蛋,不要让所有鸡蛋别装在一个篮子里,也方便大家分工开发,代码不在一个项目里,也不会冲突,最主要的是项目自己维护,多好。

比如阿里的 Dubbo,还有 Spring 全家桶里的 Spring Cloud,都是解决分布式微服务架构的优秀框架。

2. 面试官:那分布式系统环境下各自有什么优缺点?

问题分析:

优点是显而易见的,面试官主要是想看看意识到有哪些缺点和问题,不过好的方面还是要简单带过。

我:

优点很多呀,使用分布式不就是为了解决传统架构各种问题嘛,多人在一个下开发维护难,也不好控制容错能力。拆分成微服务问题就好办多了。主要从 4 个方面简单说下。

  1. 系统可用性提升
    一个系统全年可用时间在 99.999%,5 个 9 的服务可用率在设计合理的分布式系统中并不是一个触不可及的数字。

传统的集中式计算或集中式存储在遇见单点故障时很容易造成整个服务不可用,分布式下的服务体系,单台机器有故障,不致于造成整个服务不可用。

  1. 系统并发能力提升
    请求通过 Nginx 负载均衡被分发到不同的服务器上,运行同样代码的服务器可以有 1 台或 N 台,通常情况下会根据实际用户访问量随时增加机器,无论是数据库或者服务,都可以做到随时水平扩展

比如双 11 活动,平时订单少 50 台机器就够了,到了 11 订单量剧增,服务器增加到 100 台,每台机器之间相互独立,互不影响。

  1. 系统容错能力提升

(手里有笔,能给面试官随便画画)

同一组服务分别部署在北京上海杭州,杭州的机房突发断电或者火灾,杭州机房的流量会被自动分发到北京和上海的机房,不影响用户使用。

  1. 低延迟
    参考上一个图,北京的用户请求自动分发到北京,上海的用户请求被分发到上海,服务器会根据用户的 IP 选择距离自己最近的机房,降低网络延迟。

面试官:嗯,基本覆盖全面了,继续说说缺点。

凡事具有两面性,分布式服务带来很多好处的同时肯定还会带来麻烦,主要从 3 方面考虑。

  1. 分布式服务依赖网络
    服务器间通讯依赖网络,不可靠网络包括网络延时,丢包、中断、异步,一个完整的服务请求依赖一连串服务调用,任意一个服务节点网络出现问题,都可能造成本次请求失败。
  2. 维护成本高
    传统单体式服务只需要维护一个站点就可以。
    分布式服务系统被拆分成若干个小服务,服务从 1 变为几十个上百个服务后,增加运维成本。
  3. 一致性,可用性,分区容错性无法同时满足
    这个是最主要的,这三种特性就是平时说的 CAP 定理,在分布式系统中,这三种特性最多只能满足两种,无法同时满足,需要根据实际情况去调整牺牲掉其中哪个。

面试官:嗯,最主要的第三点意识到了。(面试官心理:如果能意识到 CAP 问题那就好办多了,提到 CAP,那可以继续聊聊)

成功给自己挖坑,关于 CAP,下一节单独讲解

深入分析:

(图片来源:https://medium.com/)

关于分布式系统,通俗点讲就把整个业务系统拆分成很多的服务,每个服务责任到人,服务之间代码都没有冲突,服务可以自治,每个服务到技术也可以自己选型,只要遵循统一的服务调用协议就可以了。每次发布如果就改动一个服务那就上线一个服务,不用所有人一起联调,这样每次发布牵扯到的改动影响也是可控的。不像传统单体架构服务,动辄几百万行代码融在一起。

这个概念是 Jim Waldo 在 1994 年发表的题为 “ A Note on Distributed Systems ” 的论文中提出的,感兴趣的读者可以看看英文原文。

百度百科是这样解释的:
分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。

分布式系统并不是某一门具体的技术,也不是具体的框架。用大白话理解就是将计算能力和数据存储能力分散在不同服务器上,通过网络连接组成的一个整体的服务,不同服务器可能是物理机,也可能是虚拟机,分布式的概念可以理解成一种解决方案。

分布式系统总结来说是将数据存储能力和计算能力分布到不同的服务器上,作为一个整体对外服务。目的在于解决单台机器的故障问题,单机计算和 IO 性能问题,以及单机存储空间不足的问题。虽然单机故障的概率比较小,但是随着集群规模大了之后,集群宕机和磁盘损坏基本上是常态,分布式系统主要解决的是各种故障带来的问题。

比如,美团外卖,用户角度去看这就是一个能叫外卖的 APP,选商品,提单付款,等待配送后订单完成,如果从系统开发工程师角度去看,这个小小的 APP 后面却是一个非常庞大的系统,你点一次外卖,后台会经过几十次上百次服务调用才能完成整个流程。从大的角度去看,包括商品管理系统,订单系统,支付系统,结算系统,商家系统,配送系统,风控系统等等。每一个子系统又能分成若干个微服务,各个系统逻辑上构成一个整体统一对外服务。

3. 分布式系统和微服务什么关系

关于分布式系统和微服务,两者都只是一种概念。如果你采用微服务,就意味着系统一定是分布式的,分布式系统具有的优缺点在微服务理都会体现,个人理解微服务是分布式系统的一种具体落地方案。

总结

随着互联网的发达,传统单体项目已经完全不能适应现在互联网用户量需求,2010 刚刚毕业的时候只会 SSH/SSM 就能找到工作,不了解分布式,也没听说过,很多软件公司也是一套框架打天下。如今这个时代已经过去了,经常有读者问我初学者学什么语言好找工作。如果想收到大公司面试机会,拿到 offer,编程语言只是基础,对于分布式系统基础也很重要,光靠学一门语言就想找到一份工作应该很难,所有大一点的互联网公司系统都是分布式的,公司希望招到的人也都很了解分布式相关的知识。

分布式系统的优点:

  1. 提升服务可用性 / 稳定性
  2. 提升系统并发能力
  3. 提升系统容错能力
  4. 低延迟

分布式系统缺点:

  1. 依赖网络,会因为网络问题导致系统数据丢失或不一致性;
  2. 系统复杂化,系统监控维护,版本迭代发布变得相对复杂,成本高;
  3. 一致性,可用性,分区容错性无法同时满足。

面试精讲之面试考点及大厂真题 - 分布式专栏 04 谈谈你对分布式的理解,为什么引入分布式?相关推荐

  1. 面试官系统精讲Java源码及大厂真题 - 48 一起看过的 Java 源码和面试真题

    48 一起看过的 Java 源码和面试真题 不为了源码而读源码,只为了更好的实践 持续几个月,我们的专栏终于结束了,这篇总结篇,我们又想回到当初写这篇专栏的初心:我们不为读源码而读源码,只是为了更好的 ...

  2. 面试官系统精讲Java源码及大厂真题 - 34 只求问倒:连环相扣系列锁面试题

    34 只求问倒:连环相扣系列锁面试题 自信和希望是青年的特权. 引导语 面试中,问锁主要是两方面:锁的日常使用场景 + 锁原理,锁的日常使用场景主要考察对锁 API 的使用熟练度,看看你是否真的使用过 ...

  3. 面试官系统精讲Java源码及大厂真题 - 26 惊叹面试官:由浅入深手写队列

    26 惊叹面试官:由浅入深手写队列 人生的价值,并不是用时间,而是用深度去衡量的. 引导语 现在不少大厂面试的时候会要求手写代码,我曾经看过一个大厂面试时,要求在线写代码,题目就是:在不使用 Java ...

  4. 面试官系统精讲Java源码及大厂真题 - 01 开篇词:为什么学习本专栏

    01 开篇词:为什么学习本专栏 更新时间:2019-10-30 10:08:31 才能一旦让懒惰支配,它就一无可为. --克雷洛夫 不为了源码而读源码,只为了更好的实践 你好,我是文贺,Java 技术 ...

  5. java源码pdf_面试官系统精讲Java源码及大厂真题 PDF 下载

    主要内容: 第 1 章 基础 01 开篇词:为什么学习本专栏 不为了源码而读源码,只为了更好的实践 你好,我是文贺,Java 技术专家,DDD 和业务中台的资深实践者,一周面试 2-3 次的面试官. ...

  6. 面试官系统精讲Java源码及大厂真题 - 47 工作实战:Socket 结合线程池的使用

    47 工作实战:Socket 结合线程池的使用 立志是事业的大门,工作是登堂入室的旅程. --巴斯德 引导语 Socket 面试最终题一般都是让你写一个简单的客户端和服务端通信的例子,本文就带大家一起 ...

  7. 面试官系统精讲Java源码及大厂真题 - 46 ServerSocket 源码及面试题

    46 ServerSocket 源码及面试题 引导语 上一小节我们学习了 Socket,本文我们来看看服务端套接字 API:ServerSocket,本文学习完毕之后,我们就可以把客服端 Socket ...

  8. 面试官系统精讲Java源码及大厂真题 - 45 Socket 源码及面试题

    45 Socket 源码及面试题 引导语 Socket 中文翻译叫套接字,可能很多工作四五年的同学都没有用过这个 API,但只要用到这个 API 时,必然是在重要的工程的核心代码处. 大家平时基本都在 ...

  9. 面试官系统精讲Java源码及大厂真题 - 44 场景实战:ThreadLocal 在上下文传值场景下的实践

    44 场景实战:ThreadLocal 在上下文传值场景下的实践 开篇语 我们在 <打动面试官:线程池流程编排中的运用实战>一文中将流程引擎简单地完善了一下,本文在其基础上继续进行改造,建 ...

  10. 面试官系统精讲Java源码及大厂真题 - 36 从容不迫:重写锁的设计结构和细节

    36 从容不迫:重写锁的设计结构和细节 受苦的人,没有悲观的权利. --尼采 引导语 有的面试官喜欢让同学在说完锁的原理之后,让你重写一个新的锁,要求现场在白板上写出大概的思路和代码逻辑,这种面试题目 ...

最新文章

  1. 深度学习神经网络 端到端的学习方式
  2. 华为nova3android,华为nova3和3i哪个好 华为nova3i和nova3区别对比
  3. [YTU]_2570 指针练习——变量交换
  4. 【DevExpress v17.2新功能预告】增强ASP.NET TreeList
  5. cnetos6,centos7添加新网卡,系统不识别的解决办法
  6. Hadoop权威指南 _04_第I部分Hadoop基础知识_第2章关于MapReduce
  7. 关于音乐中气息的练习
  8. HTML的基本知识(四)——文本格式化标签
  9. 使用for循环打印出大写字母的ASCII码对照表
  10. 机器学习基石 作业一
  11. caxa齿轮零件图_CAXA软件如何快速地画一个齿轮?
  12. 算法题 高斯消元解线性方程组(Python)
  13. linux查看占用负载的程序,Linux中查看负载
  14. java三三剩二五五剩三,大年三十彩灯悬,彩灯齐明光灿灿,三三数时能数尽,五五数时剩一盏,七七数时刚刚好,八八数时还缺三,...
  15. docker MySQL8
  16. windows server 批量取消域用户属性“密码永不过期”
  17. 怎么把html封装成桌面应用,如何将一个现有的Vue网页项目封装成electron桌面应用...
  18. android 3D球面的点,使用D3.js创建3D球面圆点环绕动画(带详细注解)
  19. 实现一个信息量的计算公式
  20. 四十七、MySQL数据库4

热门文章

  1. ORM组件XCode(十八般武艺)
  2. YouTube怎么判断影片内含侵权内容? 解析Content ID内容识别系统的原理及功能
  3. MongoDB 教程六: MongoDB管理:数据导入导出,数据备份恢复及用户安全与认证
  4. MongoDB 教程五: MongoDB固定集合和性能优化
  5. PHP无限极分类生成树方法,无限分级
  6. LeetCode 524. Longest Word in Dictionary through Deleting
  7. 【AI视野·今日NLP 自然语言处理论文速览 第十期】Fri, 18 Jun 2021
  8. ECCV2018 Oral论文集
  9. web标准三个要素 此标准的好处
  10. MySQL更换内存分配器