有哪些设计或实现上的难点?
分布式系统在增大系统容量、提高系统复用性、使系统扩展性更高的同时,同时也有不少难点和缺点。
网络开销传统架构,所有的业务逻辑都被打成一个代码包进行部署,所有模块运行都是在同一个JVM中,不会存在网络的开销(应用到数据库的网络开销不讨论,这里和主要指代码和代码之间的调用);而分布式架构中,模块和模块可能会被部署到不同的机器上,它们之间的访问需要通过远程调用的方式来实现,网络IO就成为不可忽视的性能瓶颈了。
特别是在微服务的阶段,服务被拆分的比较小,一次完整的业务流程可能需要几个微服务,这时候网络问题更会凸显出来。
通常我们会增加带宽、使用专线等方式,降低网络开销;代码方面,会采用失败重试或者异步化的方式,来解决网络延迟问题,后者也无疑增加了代码实现难度。
服务依赖性问题一个完整的应用,被拆分成了多个服务,服务和服务之间肯定是有依赖性的;如果有一个关键性的服务挂掉了,那么整个服务链路上的所有服务,都会产生问题。
这时候就需要进行服务治理,梳理出来关键业务和非关键业务,以及服务的调用路径;数据库要做响应的隔离;避免非关键性业务把数据库搞死,从而导致关键性业务也变成不可用;所以,理论上每个服务都要有独立的数据库,数据不做共享,但是现实中经常无法做到。
数据一致性问题Consistency:强一致性,事务保障,ACID模型;
Availiablity:高可用性,避免单点;
Partition tolerance:高可扩展性。
我们经常会说的CAP原理,也就是CAP这三个因素不可能兼顾,最多只能满足两个;分布式系统来说更为强调A和P,所以会选择适当放弃一致性,或者说分布式系统通常会选择保证最终一致性;为解决这个问题,架构中需要引入消息表、MQ(事务消息)或其他的补偿手段,这无疑也加大了项目实现的难度。
另外,分布式系统也会让测试变得更加的复杂,多层的架构也让运维变得复杂;分布式架构在提高系统可用性的同时,也带来了更多的挑战。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有