分布式系统在增大系统容量分布式操作系统、提高系统复用性、使系统扩展性更高的同时代备案,同时也有不少难点和缺点。分布式操作系统,在分布式系统中,有哪些设计或实现上的难点网络开销传统架构,所有的业务逻辑都被打成一个代码包进行部署,所有模块运行都是在同一个JVM中,不会存在网络的开销(应用到数据库的网络开销不讨论,这里和主要指代码和代码之间的调用);而分布式架构中,模块和模块可能会被部署到不同的机器上,它们之间的访问需要通过远程调用的方式来实现,网络IO就成为不可忽视的性能瓶颈了。特别是在微服务的阶段,服务被拆分的比较小,一次完整的业务流程可能需要几个微服务,这时候网络问题更会凸显出来。通常我们会增加带宽、使用专线等方式,降低网络开销;代码方面,会采用失败重试或者异步化的方式,来解决网络延迟问题,后者也无疑增加了代码实现难度。服务依赖性问题一个完整的应用,被拆分成了多个服务,服务和服务之间肯定是有依赖性的;如果有一个关键性的服务挂掉了,那么整个服务链路上的所有服务,都会产生问题。这时候就需要进行服务治理,梳理出来关键业务和非关键业务,以及服务的调用路径;数据库要做响应的隔离;避免非关键性业务把数据库搞死,从而导致关键性业务也变成不可用;所以,理论上每个服务都要有独立的数据库,数据不做共享,但是现实中经常无法做到。数据一致性问题Consistency:强一致性,事务保障,ACID模型;Availiablity:高可用性,避免单点;Partition tolerance:高可扩展性。我们经常会说的CAP原理,也就是CAP这三个因素不可能兼顾,最多只能满足两个;分布式系统来说更为强调A和P,所以会选择适当放弃一致性,或者说分布式系统通常会选择保证最终一致性;为解决这个问题,架构中需要引入消息表、MQ(事务消息)或其他的补偿手段,这无疑也加大了项目实现的难度。另外,分布式系统也会让测试变得更加的复杂,多层的架构也让运维变得复杂;分布式架构在提高系统可用性的同时,也带来了更多的挑战。我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。分布式是一种思想,旨在将原本的单节点应用分布到不同的服务器节点,以求获得更大的运算能力和更高的性能。分布式技术太广了,涉及到将多个服务器的CPU,内存硬盘等组成一个统一的整体,而服务,计算分布在不同的服务器上,服务之间的通信,分布式之后的全局唯一性,数据一致性,分布式事务等等,每一项可以说在实际工作中都会有大量的坑,不经历过很难明白,下面是我的粗浅理解:分布式存储:数据库:数据库的主从复制,读写分离,分库分表这些东西,都是通过数据分布在不同的节点,以实现数据查询与修改的更高的效率,同时防止数据在单一节点上因为某些原因的丢失,推荐自己搭建mysql主从,使用spring aop代码开发或者组件搭建读写分离,使用mycat等组件实现分库分表!文件:分布式文件存储系统,有HDFS和Gluster等大型的系统,提供更好的容错性和扩展能力!分布式服务:对外提供高度内聚,透明,内部灵活,分散的服务集群!前后端分离:将前后端的服务拆分在不同的集群中,以保证前后端技术架构上的分离,使用node.js部署前端服务,与用户进行交互,后台通过某种通信协议,提供动态数据给前端调用!后端微服务:以单独业务为导向,建立起细粒度的服务,同时服务之间通过服务发现组件进行通信,在用的springcloud还不错,集成了网关,熔断器,负载均衡等,可以进行快速的搭建!服务之间的通信通常有服务暴露直接调用(zk.eureka等服务注册与发现),异步消息传输(kafka等消息队列)!分布式缓存:缓存通常是内存型缓存,可以用来快速的存取数据,减少数据库的压力!分布式缓存通常使用主从复制,高可用方式搭建起集群,提高整个缓存系统的容纳能力,也避免单一缓存节点宕机对整个服务的影响,用的较多的是redis集群(基于redis的集群搭建,请参考:///question/6493663252021510414/) redis缓存还因为单线程模型,可以用来做分布式锁实现!分布式计算:将一些大型的计算,使用策略分布到不同的机器上,然后汇总得到计算结果,一般使用map-reduce模型,hadoop,spark等都是成熟而且大规模使用的框架!分布式技术并没有严格分类,技术也五花八门,作为一个程序员只能是每天不断的学习才能得以入门,每个人的学习能力,领悟到的东西也有不同,今天就写这么多,更多的技术分享,敬请关注。。。