在分布式系统中,有哪些设计或实现上的难点?

低调的牛肉


分布式系统在增大系统容量、提高系统复用性、使系统扩展性更高的同时,同时也有不少难点和缺点。

网络开销

传统架构,所有的业务逻辑都被打成一个代码包进行部署,所有模块运行都是在同一个JVM中,不会存在网络的开销(应用到数据库的网络开销不讨论,这里和主要指代码和代码之间的调用);而分布式架构中,模块和模块可能会被部署到不同的机器上,它们之间的访问需要通过远程调用的方式来实现,网络IO就成为不可忽视的性能瓶颈了。

特别是在微服务的阶段,服务被拆分的比较小,一次完整的业务流程可能需要几个微服务,这时候网络问题更会凸显出来。

通常我们会增加带宽、使用专线等方式,降低网络开销;代码方面,会采用失败重试或者异步化的方式,来解决网络延迟问题,后者也无疑增加了代码实现难度。

服务依赖性问题

一个完整的应用,被拆分成了多个服务,服务和服务之间肯定是有依赖性的;如果有一个关键性的服务挂掉了,那么整个服务链路上的所有服务,都会产生问题。

这时候就需要进行服务治理,梳理出来关键业务和非关键业务,以及服务的调用路径;数据库要做响应的隔离;避免非关键性业务把数据库搞死,从而导致关键性业务也变成不可用;所以,理论上每个服务都要有独立的数据库,数据不做共享,但是现实中经常无法做到。

数据一致性问题

  • Consistency:强一致性,事务保障,ACID模型;

  • Availiablity:高可用性,避免单点;

  • Partition tolerance:高可扩展性。

我们经常会说的CAP原理,也就是CAP这三个因素不可能兼顾,最多只能满足两个;分布式系统来说更为强调A和P,所以会选择适当放弃一致性,或者说分布式系统通常会选择保证最终一致性;为解决这个问题,架构中需要引入消息表、MQ(事务消息)或其他的补偿手段,这无疑也加大了项目实现的难度。


另外,分布式系统也会让测试变得更加的复杂,多层的架构也让运维变得复杂;分布式架构在提高系统可用性的同时,也带来了更多的挑战。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。


会点代码的大叔


分布式系统是将系统功能进行模块化,并且部署到不同的服务器上,每台服务器实现不同的功能,处理不同的数据。分布式主要是用于减轻服务器的压力,提升效率,以及降低系统维护的难度。但由于每台服务器处理的业务不同,如果一台服务器出现问题,必然会导致系统故障,所以一般分布式系统会和集群结合使用。

解耦:解耦是分布式系统的重点,在系统设计之初就要确定如何进行解耦、模块划分,由于不同的模块可能会由不同的团队进行开发和维护,如果模块间出现业务重叠或者交集过多,就会加大开发以及后期维护的难度。

分布事务:由于分布式系统将业务进行了拆分,而对于整个系统而言,事务是面向整个业务的,这就要求不同模块如果存在事务,则必须采用分布事务的机制来保证业务的完整性。

数据处理:分布式系统虽然将业务功能进行了模块化,但是整个系统的数据必然是完整的,那么在系统设计时要确定好数据的存储方式,是统一管理还是分开管理,从而保证数据准确性的同时提升系统的运行效率。

数通畅联 专注于企业IT架构、SOA综合集成、数据治理分析领域,感谢您的阅读与关注!


分享到:


相關文章: