首页 > 编程知识 正文

联想终面被刷的概率,JAVA后端是不是内卷严重

时间:2023-05-06 18:27:06 阅读:171467 作者:60

目录1,从单个系统

2、团队壮大,业务越来越复杂

3、弥散出现:巨大系统分开治疗

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

5、一言以蔽之,什么是分布式系统的设计和开发经验

6、补充说明:中间件系统和大数据系统

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

但是,许多后JD往往要求熟悉分布式系统的理论、设计和开发,具有复杂的分布式系统构建经验。

以前有很多同学在后台问我:“这个分布式系统的设计和开发经验,到底指的是什么? 那么,这篇文章向大家说明这个问题。

1、从单块系统说起要说什么是分布式系统,必须先从单个系统开始。

很多同学应该都知道,如果在中小型传统软件公司工作,现在做的系统可能如下。

也许所有的代码都位于一个项目中,最多可以用maven等组件工具分割代码工程模块,将不同的模块放入不同的工程代码中。

部署时,可能会直接放入在线的几台机器中,放入里面的tomcat中执行。

然后,在web服务之前可能会有负载均衡服务,例如使用nginx或其他负载均衡设备。

许多低流量的企业内部系统(如OA、CRM和财务)也可以直接部署在单台机器的tomcat下。

下次直接配置域名解析时,可能会有几十个或几百个用户访问域名并使用该软件。

关于系统的依存恐怕只有一个。 它是MySQL、Oracle等关系数据库,可以在某台机器上导入专用的数据库,用于APP应用。

请看下图,感受一下这个单元体系结构。

这样的系统在很多中小企业至今也很多。 是一个典型的单一系统,所有的代码都在一道工序中,只需要部署在一个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等大数据系统,本身也都是世界上最最复杂的分布式系统,这又涉及到大数据领域的话题了,以后有机会可以单独聊聊。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。