前言

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

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

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

1.从单块系统说起

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

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

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

在部署的时候,可能就是直接在线上的几台机器里直接放到里面的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等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

转载于:https://blog.51cto.com/13399166/2369419

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

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

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

  2. Java工程师找工作都有什么要求?

    不同的Java工程师的水平都是有所差距的,所以在找工作的时候公司对于不同能力的Java工程师的招聘要求也有所区别,主要分为初级Java工程师,中级Java工程师以及资深Java工程师三种,不同Java ...

  3. 成都java开发好找工作吗?

    成都java开发好找工作吗?现在Java程序员还是很好找工作的.如果你的技术较强,高薪不是问题.因为Java移植性强的优点,如果你熟练乃至精通的话,以后的就业前景还是很好的.在大多招聘网站上,java ...

  4. 非计算机专业学java好找工作吗_非计算机专业学习java容易找工作吗?

    原标题:非计算机专业学习java容易找工作吗? 两年前,我还是一名普普通通的在校大学生.上大学的时候除了学习专业知识以外,我还自己在校园里摆摊,买一些生活用品和文具.那个时候同学都夸我,说我有经商头脑 ...

  5. 前端开发找工作都有哪些靠谱途径?

    经常有朋友问我这个问题,前端开发找工作,都有哪些靠谱的途径呀? 其实,除了各大招聘平台外,我觉得,最靠谱的方式还是内推. 为什么呢? 1. 从内推渠道投递过去的简历,HR会优先处理,不用担心HR看不到 ...

  6. 投入Java开发实习生工作的第4天

    说实话,通过这几天的实习生工作给自己的感触和收获是非常的深刻的.先说说公司吧,本人在成都,在应聘了许多实习岗位之后,最终选择了一家实习补贴只有2400块,但是公司技术架构,业务范畴,工作环境都比较好的 ...

  7. java开发工作找不到要放弃吗,这样学习Java,才能找到一份Java开发的工作。不要盲目的学!...

    203726-156647744638f8.jpg 这篇文章,给自学的人扫扫盲区,很多人自学java都是错误的方式,导致最后浪费时间.越学越迷茫.从事Java八年,希望我的建议可以帮助到每个在学习ja ...

  8. Java学历很重要_Java开发找工作,学历重要还是技术重要?

    都很重要,一个决定你有没有面试机会,一个决定你是否能够面试通过! 目前市场上面的基本上是需要大专以上的学历,你是本科,完全可以的 至于你要考研还是去工作,这个就看你自己的决定, 选择考研的话以后的发展 ...

  9. 自学Java如何找工作?

    先说这样一个故事: 之前在的一个Java交流学习群有一个人在群里呆了将近2年,每天都在活跃,突然有一天他在群里说了一段话:"我不陪你们玩了,我找到工作了,在北京薪资是11K,你们每天都在群里 ...

最新文章

  1. css position属性
  2. 网上商城系统源代码_多用户系统商城授权有几种方式?
  3. 51岁雷军最后一次创业:要砸657亿造车,但小米「亏」得起吗?
  4. W/System.err: at android.view.ViewConfiguration.get(ViewConfiguration.java:369)
  5. JS 键盘监听事件 enter 13
  6. 海南大学计算机科学与技术专业考研,2021年海南大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...
  7. html ios视频播放器,良心推荐!iOS端的视频播放应用
  8. 【Android XMPP】 学习资料收集贴(持续更新)
  9. IComparable和Icomparer接口
  10. android groovy方法,Android Gradle从入门到精通(三)Groovy快速入门指南
  11. 游戏设计情境探秘之动画
  12. L1-027 出租 (20 分)—团体程序设计天梯赛
  13. 金万维异速联产品简介
  14. Chrome 配置samesite=none方式
  15. excel迷你图 vba_如何在Excel 2010中使用迷你图
  16. 网络安全-点击劫持(ClickJacking)的原理、攻击及防御
  17. linux vi打不开文件,在Linux中使用vi/vim打开一个文件时出现的的问题
  18. 纸牌游戏十点半c语言,纸牌游戏十点半之Excel版
  19. 2-(4-噻吩)[4,5f][1,10]邻菲啰啉|cas1070190-29-2-齐岳
  20. PIARC:各国道路设计标准的最新进展(英) (附下载)

热门文章

  1. 工程实践之 复杂保存解构 TODO
  2. CentOS+Nginx一步一步开始配置负载均衡
  3. Spring boot logback的使用(日志记录)
  4. springboot跨域解决方案
  5. x86构架之-Intel8042键盘控制器简介
  6. Go 函数的 Map 型参数,会发生扩容后指向不同底层内存的事儿吗?
  7. java中异常+连接重置_java.net.SocketException:连接重置
  8. wireshark抓组播数据_HCIE学习笔记--组播路由协议PIM-DM工作机制解析
  9. 如何自定义MongoDB的存储桶
  10. 深入理解redis中的lua脚本