面试官问我有没有分布式系统开发经验,我一脸懵圈…

2023-05-16

目录

  • 从单块系统说起
  • 团队越来越大,业务越来越复杂
  • 分布式出现:庞大系统分而治之
  • 分布式系统所带来的技术问题
  • 一句话总结:什么是分布式系统设计和开发经验
  • 补充说明:中间件系统及大数据系统

前言

现在有很多Java技术方向的同学在找工作的时候,肯定都会去招聘网站上找职位投递简历。

但是在很多职位JD上往往会有这样的一个要求:熟悉分布式系统理论、设计和开发,具备复杂分布式系统构建经验。

之前不少同学后台留言问过我:这个分布式系统的设计和开发经验,到底指的是什么?那么这篇文章就给大家来解释一下这个问题。


一、从单块系统说起

要说分布式系统是什么东西,那么就得先从单块系统开始说起。

很多同学应该都知道,如果你在一些中小型的传统软件公司里工作,那么很有可能现在在做的系统是如下这个样子。

所有的代码都在一个工程里,最多可能就是通过maven等构件工具拆分了一下代码工程模块,不同的模块可以放在不同的工程代码里。

在部署的时候,可能就是直接在线上的几台机器里直接放到里面的tomcat下来运行。

然后在web服务器前面可能会有一层负载均衡服务器,比如用nginx或者是其他的负载均衡设备。


很多流量很小的企业内部系统,比如OA、CRM、财务等系统,甚至可能就直接在一台机器的tomcat下部署一下。

然后直接配置一下域名解析,就可以让这个系统的可能几十个,或者几百个用户通过访问域名来使用这个软件了。

至于说系统的依赖大概来说很可能只有一个,那就是MySQL、Oracle等关系型数据库,可能会在某台机器上专门部署一个数据库,让应用系统来使用。

大家看看下面的图,体会一下这种单体架构。

在这里插入图片描述

这种系统在很多中小型公司里现在还是比较多的,就是典型的单块系统,所有代码在一个工程,部署在一个tomcat里即可,这里包含了系统所有的功能。

你哪怕就部署一台机器,这个系统也可以运行,只不过为了所谓的“高可用”,可能一般会部署两台机器,前面加一层负载均衡设备,这样其中一个机器挂了,另外一个机器上还有一个系统可以用。


二、团队越来越大,业务越来越复杂

其实上面说的那种单块系统,如果是一个10人以内的小团队大家一起维护和开发一个用户数量不多,请求量不大的系统,也是没问题的,还挺方便的,对吧。

你搞一个代码仓库,然后就一份代码,每个人都在自己本地写代码,最后把代码合并一下,做做测试,然后就直接部署基于Tomcat来就可以了。

但是问题就在于说,如果你的团队超过了10个人,比如有20个人,甚至几十个人,上百个人要一起协作开发这个系统,然后里面的业务逻辑特别多,可能功能模块多达几百个。这个时候就麻烦了,你要是还用那种单块系统的模式,那肯定是很痛苦的。

因为几十个人维护一个单块系统,大家在一个工程里写代码,大量的冲突以及代码合并都会让人崩溃。

而且部署的时候会有各种冲突,比如某个功能模块要上线了,但是他必须得把整个单块系统所有的功能都回归测试一遍才敢上线。

因为大家的代码都在一个工程里,都是耦合在一起的,你修改了代码,必须全部测试一遍才能保证系统正常。

所以说这个时候,就必须想办法把系统改造成分布式系统了。


三、分布式出现:庞大系统分而治之

这个时候就可以尝试把一个大的系统拆分为很多小的系统,甚至很多小的服务,然后几个人组成一个小组就专门维护其中一个小系统,或者每个人维护一个小服务。

简单来说,就是分而治之,这样每个人可以专注维护自己的代码。

然后不同的小系统自己开发、测试和上线,都不会跟别人耦合在一起,可以自己独立进行,非常的方便,大大简化了大规模系统的开发成本。

不同的子系统之间,就是通过接口互相来回调用,每个子系统都有自己的数据库,大家看下面的图。

在这里插入图片描述

四、分布式系统所带来的技术问题

那么大家这个时候可以思考一下,如果你的公司是采用这种分布式系统的方式来构建公司的一个大规模系统的,那么这个时候会涉及到哪些技术问题?

  • (1)分布式服务框架

你如果要让不同的子系统或者服务之间互相通信,首先必须有一套分布式服务框架。

也就是各个服务可以互相感知到对方在哪里,可以发送请求过去,可以通过HTTP或者RPC的方式。

在这里,最常见的技术就是dubbo以及spring cloud,当然大厂一般都是自己有服务框架

  • (2)分布式事务

一旦你的系统拆分为了多个子系统之后,那么一个贯穿全局的分布式事务应该怎么来实现?

这个你需要了解TCC、最终一致性、2PC等分布式事务的实现方案和开源技术。

  • (3)分布式锁

不同的系统之间如果需要在全局加锁获取某个资源的锁定,此时应该怎么来做?

毕竟大家不是在一个JVM里了,不可能用synchronized来在多个子系统之间实现锁吧,是不是?

  • (4)分布式缓存

如果你原来就是个单块系统,那么你其实是可以在单个JVM里进行本地缓存就可以了,比如搞一个HashMap来缓存一些数据。

但是现在你有很多个子系统,他们如果要共享一个缓存,你应该怎么办?是不是需要引入Redis等缓存系统?

  • (5)分布式消息系统

在单块系统内,就一个JVM进程内部,你可以用类似LinkedList之类的数据结构作为一个本地内存里的队列。

但是多个子系统之间要进行消息队列的传递呢?那是不是要引入类似RabbitMQ之类的分布式消息中间件?

  • (6)分布式搜索系统

如果在单块系统内,你可以比如在本地就基于Lucene来开发一个全文检索模块,但是如果是分布式系统下的很多子系统,你还能直接基于Lucene吗?

明显不行,你需要在系统里引入一个外部的分布式搜索系统,比如Elasticsearch。

  • (7)其他很多的技术

比如说分布式配置中心、分布式日志中心、分布式监控告警中心、分布式会话,等等,都是分布式系统场景下你需要使用和了解的一些技术。

因为沿用单块系统时代的那些技术已经不行了,比如说你单块系统的时候,直接在本地用一个properties文件存放自己的配置即可,日志也写到本地即可。

但是分布式时代呢?

你那么多的子系统,怎么共享同一份配置?怎么把各个系统的日志聚合写到一个地方来查看?

单块系统的时候,你一个web应用直接基于Servlet API提供的Session会话功能即可,那么分布式时代呢,你有N多个子系统如果要共享会话该怎么做?


五、一句话总结:什么是分布式系统设计和开发经验?

其实分析完了之后,大家应该就大概知道了,招聘JD上写这个分布式系统的设计和开发经验,其实他是一个很大的主题,里面包含很多的内容。

你的系统一旦分布式了之后,通信、缓存、消息、事务、锁、配置、日志、监控、会话,等等各种原来单块系统场景下很容易解决的问题,都会变得很复杂,需要引入大量外部的技术。

所以你有没有参与过类似这样的一个大的分布式系统?你有没有基于各种技术解决过分布式系统场景下的各种技术问题?这就是人家希望和要求的分布式系统设计和开发的经验。如果大家还没接触过,建议多去学习一下。


六、补充说明:中间件系统及大数据系统

最后给大家说明一点,一般这种招聘JD,如果是Java岗位要求分布式相关的经验,其实主要还是上面说的那些东西,他面向的是分布式的业务系统的构建。

但是其实分布式系统本身是一个非常复杂的话题,因为刚才说的只是一个分布式业务系统要依赖哪些技术来进行构建。

但是其实比如Kafka、Rocket等中间件,本身他也是分布式的,你要搞明白他们自己是如何实现分布式的,又是一个非常复杂的话题。

此外,像hadoop、spark、hbase等大数据系统,本身也都是世界上最最复杂的分布式系统,这又涉及到大数据领域的话题了,以后有机会可以单独聊聊。

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

面试官问我有没有分布式系统开发经验,我一脸懵圈… 的相关文章

随机推荐

  • Java 并发高频面试题:聊聊你对 AQS 的理解?

    一 写在前面 这篇文章 xff0c 我们来聊聊面试时一个比较有杀伤力的问题 xff1a 聊聊你对AQS的理解 xff1f 之前有同学反馈 xff0c 去互联网公司面试 xff0c 面试官聊到并发时就问到了这个问题 当时那位同学内心估计受到了
  • 自从上了Prometheus,睡觉真香!

    文章来源 xff1a https c1n cn ojbYT 目录 学习目标任务背景任务要求任务分析Prometheus 实战 学习目标 如下 xff1a 能够安装 prometheus 服务器能够通过安装 node exporter 监控远
  • 面试官问我有没有高并发架构经验,我慌的一批…

    目录 一 1 道面试题的背景引入二 先考虑一个最简单的系统架构三 系统集群化部署四 数据库分库分表 43 读写分离五 缓存集群引入六 引入消息中间件集群七 现在能hold住高并发面试题了吗八 本文能带给你什么启发 xff1f 一 的背景引入
  • 我只是把握好了这3点,1个月后成功拿下大厂offer!

    目录 一 写在前面二 技术广度的快速准备三 技术深度的快速准备四 基础功底的快速准备五 下篇预告 一 写在前面 春节过后 xff0c 即将迎来的是一年一度的金三银四跳槽季 假如你准备在金三银四跳槽的话 xff0c 那么作为一个Java工程师
  • 程序员简历上写这种项目,难怪面试当炮灰。。。

    目录 xff1a 高级工程师必备 xff1a 系统设计能力如何让你的项目更有技术含量 上篇文章 我只是把握好了这3点 xff0c 1个月后成功拿下大厂offer xff01 我们聊了聊Java工程师在跳槽前的1个月 xff0c 如何利用较短
  • 程序员不了解这些投简历的巨坑,面试注定一开始就失败!

    目录 前言第一阶段 xff1a 练手第二阶段 xff1a 冲刺第三阶段 xff1a 收尾 前言 之前写了两篇文章 xff0c 给大家介绍了一下如何利用短期的时间 xff0c 尽可能充分的为面试做准备 xff1a 1 我只是把握好了这3点 x
  • 用真实业务场景告诉你,高并发下如何设计数据库架构?

    目录 xff1a 用一个创业公司的发展作为背景引入用多台服务器来分库支撑高并发读写大量分表来保证海量数据下查询性能读写分离来支撑按需扩容及性能提升高并发下的数据库架构设计总结 这篇文章 xff0c 我们来聊一下对于一个支撑日活百万用户的高并
  • 分布式唯一ID的几种生成方案,一次性全掌握!

    上一篇文章 xff0c 我们聊了一下分库分表相关的一些基础知识 xff0c 具体可以参见 xff1a 用真实业务场景告诉你 xff0c 高并发下如何设计数据库架构 xff1f 这篇文章 xff0c 我们就接着分库分表的知识 xff0c 来具
  • 程序员别死背面试八股文了,这种面试题才是未来主流。。。

    目录 xff1a 面试官为啥要出这样一个开放式问题生产消费模型及核心数据结构支撑TB级数据写入的分布式架构数据宕机场景下的高可用架构支持数据不丢失的ack机制最后的总结 1 面试官为啥要出这样一个开放式问题 这篇文章简单给大家来聊一个互联网
  • 面试官问我微服务注册中心如何保证数据强一致性?头秃了。。。

    目录 1 再回顾 xff1a 什么是服务注册中心 xff1f 2 Consul服务注册中心的整体架构3 Consul如何通过Raft协议实现强一致性 xff1f 4 Consul如何通过Agent实现分布式健康检查 xff1f 1 再回顾
  • Linux 时间同步 chrony

    介绍 Chrony 是NTP xff08 Network Time Protocol xff0c 网络时间协议 xff0c 服务器时间同步的一种协议 xff09 的另一种实现 xff0c 与ntpd不同 xff0c 它可以更快且更准确地同步
  • 字节面试官: 让你设计一个MQ每秒要抗几十万并发,怎么做?

    目录 1 页缓存技术 43 磁盘顺序写2 零拷贝技术3 最后的总结 这篇文章来聊一下Kafka的一些架构设计原理 xff0c 这也是互联网公司面试时非常高频的技术考点 Kafka是高吞吐低延迟的高并发 高性能的消息中间件 xff0c 在大数
  • 35岁高龄程序员的 4 条出路,提早布局,避免出局!

    目录 一 40岁回首往事 xff1a 自己竟没有任何核心优势二 公司遇到危机时40岁大龄程序员会怎么样三 适合大龄程序员的几条职业发展路线四 最后的寄语 这篇文章 xff0c 给大家聊聊Java工程师的职业发展规划的一些思考 xff0c 同
  • 面试官让我聊聊 MQ 的数据丢失问题,没想到水这么深。。。

    目录 一 背景引入二 Kafka分布式存储架构三 Kafka高可用架构四 画图复现Kafka的写入数据丢失问题五 Kafka的ISR机制是什么 xff1f 六 Kafka写入的数据如何保证不丢失 xff1f 七 总结 一 背景引入 这篇文章
  • 面试官:请设计一个能支撑百万连接的系统架构!

    目录 1 到底什么是连接 xff1f 2 为什么每次发送请求都要建立连接 xff1f 3 长连接模式下需要耗费大量资源4 Kafka遇到的问题 xff1a 应对大量客户端连接5 Kafka的架构实践 xff1a Reactor多路复用6 优
  • 二本学历5年经验的程序员,出去面试被碾压~

    目录 1 从一个求职案例引入2 学历差距 xff1a 面试官的第一印象3 公司背景差距 xff1a 你的人生名片4 技术差距 xff1a 硬核能力的欠缺5 架构能力的差距6 面试结果的分析 这篇文章 xff0c 聊一个很多人感兴趣的话题 x
  • 连你女朋友都能看懂的分布式架构原理!

    目录 从一个新闻门户网站案例引入推算一下你需要分析多少条数据 xff1f 黄金搭档 xff1a 分布式存储 43 分布式计算 这篇文章聊一个话题 xff1a 什么是分布式计算系统 xff1f 一 从一个新闻门户网站案例引入 现在很多同学经常
  • 面试官: 你们生产环境的JVM怎么设置的?

    前言 这篇文章 xff0c 给大家聊一个生产环境的实践经验 xff1a 线上系统部署的时候 xff0c JVM堆内存大小是越大越好吗 xff1f 先说明白一个前提 xff0c 本文主要讨论的是Kafka和Elasticsearch两种分布式
  • 我用笨办法啃下了一个开源项目的源码!

    目录 1 从最简单的源码开始 xff1a 别幻想一步登天 2 循序渐进 xff1a 先搞定底层依赖的技术 3 一定要以Hello World作为入口来阅读 4 抓大放小 xff0c 边写注释边画图 5 反复三遍 xff0c 真正理解源码 6
  • 面试官问我有没有分布式系统开发经验,我一脸懵圈…

    目录 从单块系统说起团队越来越大 xff0c 业务越来越复杂分布式出现 xff1a 庞大系统分而治之分布式系统所带来的技术问题一句话总结 xff1a 什么是分布式系统设计和开发经验补充说明 xff1a 中间件系统及大数据系统 前言 现在有很