目录从单体系统开始,团队越来越大,业务越来越复杂。分布式涌现:分而治之庞大的系统。分布式系统带来的技术问题。一句话总结:分布式系统的设计开发经验是什么?补充说明:中间件系统和大数据系统前言现在很多Java技术方向的同学在找工作的时候,肯定会去招聘网站找工作,投简历。但是在很多JD岗位上,往往会有这样的要求:熟悉分布式系统理论、设计和开发,有搭建复杂分布式系统的经验。之前有很多同学在后台留言问我:这个分布式系统的设计开发经验是什么?那么这篇文章就来为大家解释一下这个问题。1.从单体系统说起要说什么是分布式系统,就得从单体系统说起。很多同学应该都知道,如果你在一些中小的传统软件公司工作,很有可能你现在做的系统是这个样子的。所有代码都在一个项目中。顶多可以通过maven等组件化工具将代码项目模块进行拆分。不同的模块可以放在不同的项目代码中。部署的时候,可能直接放在tomcat里面几台机器上运行就行了。那么web服务器前面可能还有一层负载均衡服务器,比如nginx或者其他负载均衡设备。很多小流量的企业内部系统,比如OA、CRM、财务等系统,甚至可能直接部署在一台机器的tomcat下。然后直接配置域名解析,让这个系统的几十个或者几百个用户通过访问域名就可以使用这个软件了。至于系统的依赖,大概只有一种,那就是MySQL、Oracle等关系型数据库。数据库可以专门部署在某台机器上,供应用系统使用。看看下图,感受一下这个单体架构。这种制度在很多中小企业还是比较普遍的。这是一个典型的单体系统。所有代码在一个项目中,可以部署在一个tomcat中,包含了系统的所有功能。即使你只部署一台机器,系统仍然可以运行,但是为了所谓的“高可用”,一般可能部署两台机器,前面加一层负载均衡设备,让其中一台机器挂掉,而另一台机器上有另一个可用的系统。2、团队越来越大,业务越来越复杂。其实上面说的单体系统如果是一个10人以下的小团队,大家一起来维护和开发一个用户量和请求量都很少的系统。没问题,挺方便的吧?你建一个代码仓库,然后就是一段代码,大家在本地写代码,最后合并代码,做测试,然后直接基于Tomcat部署。但是问题是,如果你的团队有10个人以上,比如20个人,甚至几十个人,几百个人一起开发这个系统,然后里面有很多业务逻辑,而且可能有数百个功能模块。个人。这时候,就麻烦了。如果你还用单块系统模式,那一定很痛苦。因为几十个人维护一个单体系统,每个人都在一个项目里写代码,大量的冲突和代码合并会让人崩溃。而且部署的时候还会有各种冲突。比如某个功能模块要上线了,但是他必须返回测试整个单块系统的所有功能才敢上线。因为大家的代码都在同一个项目中,所以都是耦合在一起的。如果修改代码,必须全部测试,确保系统正常。所以这个时候,我们必须想办法把系统改造为分布式系统。3、分布式的出现:巨大的系统分而治之这时候可以尝试把一个大系统拆分成很多小系统,甚至是很多小服务,然后几个人组成一个小组来维护其中一个小系统,或者每个人维护一个小服务。简单来说就是分而治之,让每个人都可以专注于维护自己的代码。然后不同的小系统可以自己开发、测试和上线,不需要和其他的耦合,可以独立进行,非常方便,大大简化了大型系统的开发成本。不同的子系统通过接口来回调用。每个子系统都有自己的数据库。请看下图。4、分布式系统带来的技术问题那么这个时候大家可以想一想。如果你们公司采用这种分布式系统的方式来搭建一个公司的大型系统,这个时候会涉及到哪些技术?问题?(1)分布式服务框架要想不同的子系统或服务之间进行通信,首先要有一个分布式服务框架。也就是说,每个服务都可以感知到对方的行踪,并可以通过HTTP或RPC向对方发送请求。这里最常用的技术是dubbo和springcloud。当然大厂一般都有自己的服务框架(2)分布式事务。一旦你的系统被拆分成多个子系统,一个贯穿整个世界的分布式事务应该如何实现呢?为此,需要了解TCC、最终一致性、2PC等分布式事务的实现方案和开源技术。(3)如果分布式锁需要全局加锁,获取不同系统之间的资源锁,此时应该怎么办?毕竟大家已经不在同一个JVM中了。不可能用synchronized实现多个子系统之间的锁吧?(4)分布式缓存如果你原本是单块系统,那么其实可以在单个JVM中进行本地缓存,比如创建一个HashMap来缓存一些数据。但是现在你有很多子系统,如果他们想共享一个缓存,你该怎么办?有必要引入Redis这样的缓存系统吗?(5)分布式消息系统在单块系统中,在一个JVM进程内,可以使用LinkedList这样的数据结构作为本地内存中的队列。但是多个子系统之间的消息队列传递呢?那是不是要引入像RabbitMQ这样的分布式消息中间件?(6)如果分布式搜索系统是单体系统,可以在本地基于Lucene开发全文搜索模块,但是如果分布式系统有很多子系统,是否还可以直接基于Lucene?显然不是,需要在系统中引入一个外部的分布式搜索系统,比如Elasticsearch。(7)其他很多技术,比如分布式配置中心、分布式日志中心、分布式监控告警中心、分布式会话等,都是分布式系统场景下需要用到和了解的一些技术。因为已经不可能再使用单体系统时代的那些技术了。比如当你有一个单体系统时,你可以直接用一个properties文件在本地存储你自己的配置,也可以在本地写日志。但是分布式时代呢?您如何与这么多子系统共享相同的配置?如何将各个系统的日志汇总写入一处以供查看?在单块系统的情况下,你的web应用可以直接基于ServletAPI提供的Session函数。分布式时代,子系统超过N个,想共享session怎么办?5、一句话概括:什么是分布式系统设计开发经验?其实分析完大家应该大概知道,这个分布式系统的设计开发经验是写在招聘京东上的。其实这个话题很大,包含的内容也很多。一旦你的系统是分布式的,通信、缓存、消息、事务、锁、配置、日志、监控、session等原本在单块系统场景下容易解决的问题都会变得非常复杂。引进大量外部技术。那么你接触过这样的大型分布式系统吗?你有没有基于各种技术解决过分布式系统场景下的各种技术问题?这就是人们想要和要求的分布式系统设计和开发经验。如果没有接触过,建议多了解一下。6.补充说明:中间件系统和大数据系统最后跟大家说明一下,一般这种招聘JD,如果是Java岗位,需要分布式相关经验,其实主要就是上面说的那些东西.他是面向分布式业务系统的建设。但其实分布式系统本身就是一个很复杂的话题,因为我刚才说的只是一个分布式业务系统依赖什么技术来构建。但其实Kafka、Rocket等中间件也是分布式的。你需要了解他们是如何实现分布式的,这是一个很复杂的话题。此外,hadoop、spark、hbase等大数据系统是世界上最复杂的分布式系统。这就涉及到大数据的话题了,有机会可以单独说一下。
