IT之道-艾锑知道

您当前位置: 主页 > 资讯动态 > IT知识库 >

IT运维知识:什么是分布式系统


2020-03-25 16:06 作者:艾锑无限

如何应对我们人生中的问题

 
 
 
 
谈到人生中的问题,这好像是一个大话题,不过我只是想和大家分享我对人生中的这些问题的认知及领悟,又或者说在我人生中的这些问题我是对如何应对的,又有那些收获,有句话说“以史为鉴知兴衰,以人为镜明得失”。
 
小的时候,整天玩的不意乐乎,不知道人生中还有问题,所以没心没肺的那段日子在记忆里好像连碎片都没有,不知道是遗忘,还是没有什么值得记起的事。进入学校,好像自己慢慢接触的人越来越多,做的事也越来越多,问题好像被它们挤了出来,而且好像越挤越多。现在我总结了几点,第一,我发现问题会随年龄的增大而增多。第二,问题会随你接触的人或事越多而越多。第三,问题会随着你能力的越大而越多。当我发现这些问题的时候,我几乎绝望了,这可怎么办,我这辈子都解决不完问题,而且我差点得了成长恐惧症,都不敢学习了,这要是学多了,能力变强了,反而问题更多了,这可怎么办?
 
三十年后,我在一次回头看小时候的这些想法,未免有些可笑,但确实还是应证了小时候的总结,在学校只有学校问题,进入社会后又有了社会问题,找到了工作就发生了工作问题,创办企业又有了创业问题,成了家庭又有了家庭问题,交了朋友多了朋友问题,我发现从长大到现在问题是越来越多,越来越复杂,越来越有学问。
 
难道我们这辈子就离不开问题了吗,对,说对了,这辈子我们都要和问题在一起,我们因问题而出生,我们因问题而长大,我们因问题而学习,我们更因问题而富足,最终我们也会因问题而走向死亡。当我发现其实问题是我们一生最忠实的伙伴,它会真实的让我们看到自己,看清自己,看透自己。更会与我们时时相伴,不离不弃。但大部分人还没有看透问题,理解问题的时候,他们会报怨问题的发生,他们会想办法躲避问题,他们以为自己可以逃避问题,但最终会被更多的问题所困绕。而那些往往把问题当朋友,真心与其相处,并努力去了解问题,最终穿越问题的朋友却最终因问题成长,收获。

 
 
 
 
在这里我有三个法则分享给大家,希望它们能更好的让你应对生命中的问题:
 
第一法则:万事万物,阴阳两面. 当我们看到一个问题时,也就意味着同时是生命中的一个启示,我们把焦点放在问题上,就会越陷越深,问题就真成了问题,如果把焦点放在启示上,就会问自己学到什么,从而会透过问题打开一个全新的开始,也许会成为我们一个起点或巧点,让我们因问题而有所改变,因问题有所成长,因问题更得更好.
 
第二法则:循环往复,一切因果. 如果中立来看,问题只是事件呈现出来的信息,破解信息背后的译码,我们就能读懂因果循环的规律,掌握规律就掌握了万事万物运行的根本,所以透过问题看本质,是不是感谢问题的出现.
 
第三法则:超越世相,万法归一.其实这个世间的相皆为幻相,就像我们看到的全息影像视频一样,人生的所有问题都是时间的问题,时间可以让一切问题都不是问题,当我们不在纠结,不在把能量放在这些幻相上时,所有的问题都会自生自灭.回归本初,用心放在当下,去体验和享受这个世界给我们带来的一切吧.

IT运维知识:什么是分布式系统
 
 
现在有很多Java技术方向的同学在找工作的时候会有这样的一个要求:熟悉分布式系统理论、设计和开发,具备复杂分布式系统构建经验。之前不少同学后台留言问过我:这个分布式系统的设计和开发经验,到底指的是什么?那么这篇文章就给大家来解释一下这个问题。

 

 
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.一句话总结:什么是分布式系统设计和开发经验?

其实分析完了之后,大家应该就大概知道了,招聘上写这个分布式系统的设计和开发经验,其实他是一个很大的主题,里面包含很多的内容。你的系统一旦分布式了之后,通信、缓存、消息、事务、锁、配置、日志、监控、会话,等等各种原来单块系统场景下很容易解决的问题,都会变得很复杂,
需要引入大量外部的技术。所以你有没有参与过类似这样的一个大的分布式系统?你有没有基于各种技术解决过分布式系统场景下的各种技术问题?这就是人家希望和要求的分布式系统设计和开发的经验。如果大家还没接触过,建议多去学习一下。

 

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

最后给大家说明一点,一般这种招聘如果是Java岗位要求分布式相关的经验,其实主要还是上面说的那些东西,他面向的是分布式的业务系统的构建。但是其实分布式系统本身是一个非常复杂的话题,因为刚才说的只是一个分布式业务系统要依赖哪些技术来进行构建。但是其实比如Kafka、Rocket
等中间件,本身他也是分布式的,你要搞明白他们自己是如何实现分布式的,又是一个非常复杂的话题。此外,像hadoop、spark、hbase等大数据系统,本身也都是世界上最最复杂的分布式系统,这又涉及到大数据领域的话题了,以后有机会可以再谈。



相关文章

IT外包服务
二维码 关闭