Java开发找工做最懵圈的问题:到底啥是分布式系统开发经验?

 

前言

如今有不少Java技术方向的同窗在找工做的时候,确定都会去招聘网站上找职位投递简历。nginx

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

以前很多同窗后台留言问过我:这个分布式系统的设计和开发经验,到底指的是什么?那么这篇文章就给你们来解释一下这个问题。spring

1.从单块系统提及

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

不少同窗应该都知道,若是你在一些中小型的传统软件公司里工做,那么颇有可能如今在作的系统是以下这个样子。数据库

全部的代码都在一个工程里,最多可能就是经过maven等构件工具拆分了一下代码工程模块,不一样的模块能够放在不一样的工程代码里。缓存

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

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

不少流量很小的企业内部系统,好比OA、CRM、财务等系统,甚至可能就直接在一台机器的tomcat下部署一下。数据结构

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

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

你们看看下面的图,体会一下这种单体架构。

这种系统在不少中小型公司里如今仍是比较多的,就是典型的单块系统,全部代码在一个工程,部署在一个tomcat里便可,这里包含了系统全部的功能。

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

2.团队愈来愈大,业务愈来愈复杂

其实上面说的那种单块系统,若是是一个10人之内的小团队你们一块儿维护和开发一个用户数量很少,请求量不大的系统,也是没问题的,还挺方便的,对吧。

你搞一个代码仓库,而后就一份代码,每一个人都在本身本地写代码,最后把代码合并一下,作作测试,而后就直接部署基于Tomcat来就能够了。

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

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

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

由于你们的代码都在一个工程里,都是耦合在一块儿的,你修改了代码,必须所有测试一遍才能保证系统正常。

因此说这个时候,就必须想办法把系统改形成分布式系统了。

3.分布式出现:庞大系统分而治之

这个时候就能够尝试把一个大的系统拆分为不少小的系统,甚至不少小的服务,而后几我的组成一个小组就专门维护其中一个小系统,或者每一个人维护一个小服务。

简单来讲,就是分而治之,这样每一个人能够专一维护本身的代码。

而后不一样的小系统本身开发、测试和上线,都不会跟别人耦合在一块儿,能够本身独立进行,很是的方便,大大简化了大规模系统的开发成本。

不一样的子系统之间,就是经过接口互相来回调用,每一个子系统都有本身的数据库,你们看下面的图。


4.分布式系统所带来的技术问题

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

(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多个子系统若是要共享会话该怎么作?

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

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

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

因此你有没有参与过相似这样的一个大的分布式系统?你有没有基于各类技术解决过度布式系统场景下的各类技术问题?这就是人家但愿和要求的分布式系统设计和开发的经验。若是你们还没接触过,建议多去学习一下。

6.补充说明:中间件系统及大数据系统

最后给你们说明一点,通常这种招聘JD,若是是Java岗位要求分布式相关的经验,其实主要仍是上面说的那些东西,他面向的是分布式的业务系统的构建。

可是其实分布式系统自己是一个很是复杂的话题,由于刚才说的只是一个分布式业务系统要依赖哪些技术来进行构建。

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

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

欢迎工做一到五年的Java工程师朋友们加入个人我的粉丝群Java填坑之路:789337293 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代!  

相关文章
相关标签/搜索