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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

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

前言

现在有很多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等大数据系统本身也都是世界上最最复杂的分布式系统这又涉及到大数据领域的话题了以后有机会可以单独聊聊。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6