前言

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

作者:中华石杉,十余年BAT架构经验倾囊相授。
个人微信公众号:石杉的架构笔记(ID:shishan100)

到底什么是分布式系统?相关推荐

  1. 到底什么是分布式系统

    转载自 到底什么是分布式系统 分布式系统背景 说分布式系统必须要说集中式系统,集中式系统中整个项目就是一个独立的应用,整个应用也就是整个项目,所有的东西都在一个应用里面. 如下图所示 如一个网站就是一 ...

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

    前言 现在有很多Java技术方向的同学在找工作的时候,肯定都会去招聘网站上找职位投递简历. 但是在很多职位JD上往往会有这样的一个要求:熟悉分布式系统理论.设计和开发,具备复杂分布式系统构建经验. 之 ...

  3. 到底啥是分布式系统开发经验?

    现在有很多Java技术方向的同学在找工作的时候,肯定都会去招聘网站上找职位投递简历. 但是在很多职位JD上往往会有这样的一个要求:熟悉分布式系统理论.设计和开发,具备复杂分布式系统构建经验. 这个分布 ...

  4. [分布式]到底啥是分布式系统开发经验

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

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

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

  6. 到底什么是分布式系统?你需要了解这些

    摘要:什么是分布式系统?为什么要用分布式系统?分布式系统如何分布?这些你知道吗? 小引 分布式系统是一个古老而宽泛的话题,而近几年因为 "大数据" 概念的兴起,又焕发出了新的青春与 ...

  7. 到底什么是分布式系统,该如何学习

    点击上方"互扯程序",选择"置顶公众号" 优秀文章,第一时间送达! KS Knowledge Sharing 知识分享 现在是资源共享的时代,同样也是知识分享的 ...

  8. 分布式系统的面试题1

    我之前有一些同学,之前呢主要是做传统行业,外包项目,互联网公司,一直是那种小的公司,技术一直都搞的比较简单.共同的一个问题,就是都没怎么搞过分布式系统,现在互联网公司,一般都是做分布式的系统,大家都不 ...

  9. 分布式与集群的区别到底是什么?

    零基础自学java,点击了解:https://how2j.cn 本文章转载自(如有侵权联系我删除):微信公众号Java技术栈 分布式 在IDF05(Intel Developer Forum 2005 ...

最新文章

  1. 2014目标!!!!
  2. 超级计算机为什么快,演讲视频_为什么这台超级计算机如此快? (有声) _沪江英语...
  3. 华为电脑c语言总是错误,关于华为机试题求代码!解决方法
  4. 《数据挖掘与数据化运营实战 思路、方法、技巧与应用》—— 读书笔记
  5. Image、Byte[]、Bitmap相互转换
  6. WorldWind Java 版学习:1、启动过程
  7. (15)Node.js 自定义模块
  8. java 合并对象中属性_Java2个对象形集合按某一个属性合并
  9. 美区苹果id关闭双重认证_双重认证
  10. rscp胎位图_4种胎位图解,孕30周这个姿势最适合顺产
  11. 在线OPML压缩工具
  12. 第16章Stata面板数据分析
  13. 查计算机主板,怎么查看自己电脑的主板型号是什么?主板型号查询检查方法
  14. 重庆财经职业学院计算机一级考试题,2021年重庆财经职业学院单招语文考试模拟试题库...
  15. “时间的朋友”2017跨年演讲全回顾
  16. 策略模式(用策略模式实现我们淘宝,京东,美团等等简易满减活动)
  17. 今日知识资源干货分享
  18. 这位博主居然说“我就是看故事也要把这知识学了”
  19. android支付宝支付接口申请,支付宝分享SDK接入指南—Android
  20. python 课程体系

热门文章

  1. 3D Talking Face with Personalized Pose Dynamics 论文翻译
  2. 大众点评网站源码_与大众分享您的网站
  3. 彻底解决spring security oauth2 自动续签token问题(升级版)
  4. Web Assembly
  5. Activity学习日记(九)
  6. 【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解
  7. 服务器、存储、数据保护……又把奖拿了个遍
  8. WinForm控件之【MaskedTextBox】
  9. Excel 字符串拼接
  10. Jmeter测试计划元件+后置处理器元件+执行顺序