分布式系统设计思想在工程实践中的应用

背景介绍

随着科技的发展、互联网的普及和数据规模的不断增长,传统的集中式系统往往难以满足这些需求,尤其是在性能、可靠性、灵活性等方面更是捉襟见肘,因此分布式系统设计思想应运而生。分布式系统设计思想的出发点在于应对大规模数据和高并发的挑战,满足用户对高性能、可靠性和可扩展性的需求。其重要意义是能够帮助工程师设计和构建能够应对上述挑战的系统。今天,我们来看下工程实践中用到了哪些分布式系统的设计思想。

设计思想

  • 可伸缩性(Scalability): 分布式系统应具备良好的可伸缩性,即能够在面对不断增长的负载时,通过增加硬件资源和节点数量,保持性能的稳定和可接受的响应时间。可伸缩性的设计可以通过水平扩展(增加更多的机器)和垂直扩展(增加机器的资源)实现。

  • 容错性(Fault Tolerance): 分布式系统应对单个组件出现故障或异常情况具备容错能力,即能够自动检测、隔离和恢复从而保证系统的正常运行。

  • 一致性(Consistency): 分布式系统涉及到多个节点和副本的数据存储和操作,数据一致性是一个重要的设计目标。一致性指的是在任何时刻,不同节点和副本之间的数据是一致的。

  • 可靠性(Reliability): 可靠性指的是分布式系统能够在长时间运行过程中,不断提供正确的结果。为了实现可靠性,分布式系统应该具备容错性和恢复性,并且能够对错误进行检测和修复以确保系统的连续性。

  • 可扩展性(Extensibility): 分布式系统应该具备良好的可扩展性,即能够方便地添加新的功能模块或扩展现有的功能。

  • 安全性(Security): 分布式系统应该具备安全性,保障数据在传输和存储过程中的机密性、完整性和可靠性。

业务挑战

由于篇章有限,我们从上述的分布式系统设计思想挑选几个典型问题展开讨论,例如一致性、容错性、可拓展性问题。

  • 一致性 - 由于系统的复杂性和网络的不稳定性,可能会导致请求重复或者请求丢失,从而导致数据的不一致。
  • 容错性 - 无论是消息中间件还是数据库中间件,我们始终无法保障服务100%可用,如何设计面向中间件的容错方案是工程事件中首先要解决的问题。
  • 可伸缩性 - 随着计算元数据的增长,普通的水平扩容已经无法性能的要求,而垂直扩容的成本有很高。这也是工程实践中的主要挑战之一。

工程实践

就上述三个典型问题,我们解决工程实践看下如何解决。

  • 一致性
    • 问题-请求失败或者重复
    • 方案- 基于幂等+重试+告警方案

在分布式系统中,由于网络延迟、部分失败和重试机制等因素,可能出现系统无法保证请求的可靠性,导致请求被重复发送或处理。此时,幂等性能够保证在请求被重复处理时,系统的状态和结果保持一致,不会产生重复的业务逻辑执行或数据修改。

工程实际中,我们发现使用唯一标识符UUID的可靠性、可维护性是最佳的。而且可以以通用组件的形式提供给整个部门使用。通过注册业务接口,恢复组件(见下节内容)以及告警平台的集成,可以很好的处理因为网络问题导致的失败问题。对于整个系统提供了相对平衡的一致性保障。

  • 容错性
    • 问题 - 中间件不可用
    • 方案 - 基于本地文件的数据恢复方案

容错性的设计思想是比较通用的,即借助冗余备份、故障检测和自动恢复机制来实现。在实际的工程实践中,我们 无法避免网络分区问题,因此在设计容错方案时首先要排除依赖网络的方案。从可靠性和通用性来说,基于本地文本的方案是最佳选择。设计方案如下:

核心的设计思路是对于依赖中间件的幂等方法,通过注解@FileRecovery配置,使用AOP拦截入参和返回结果。如果返回异常与注解配置匹配,则采集该方法和入参,发送给恢复组件的任务队列。任务队列负责将该业务恢复数据写到对应的文件路径。调度器根据Zookeeper的配置,开始轮询指定文件路径下的文件,并通过反射机制重新执行方法。如果超过容忍策略,则上报告警信息。

  • 可伸缩性
    • 问题 - 元数据增长
    • 方案- 基于数据分片的分布式计算元数据方案

计算元数据随着业务的发展,也是逐步增加的。在初期,我们可以通过水平拓展的方式轻松的应对。但是当数据从512M增长到1G,再到10G时,单实例的性能瓶颈越发明显,这个时候我们可以选择垂直扩容。但是数据仍旧持续增大,垂直扩容的成本越来越高。为了避免后续的窘境和成本增加,我们选择了以数据分片为基础的分布式元数据计算方案。整体设计如下:

核心的设计思想就是数据分片。数据分片技术的应用,一是解决了元数据集持续增长,二是通过多副本提高了并发度。既能解决性能问题,也可以通过水平拓展,实现集群弹性扩缩容。是一个典型的分布式系统应用场景。

思考总结

由于现代应用和服务的复杂性和规模日益增长,分布式系统设计思想成为了解决这些挑战的关键。它提供了一种可靠、高效和可扩展的架构来构建和部署分布式系统,从而满足用户的需求并提供流畅和可靠的体验。 因此,在复杂的业务需求中如何灵活运用这些宝贵的技术显得尤为重要。 技术,以服务业务为主,只有产生了实际的业务价值,才是有效的技术,才是有价值的技术。 我们虽然一直在探索技术的发展,紧跟紧跟再紧跟,其实,回过头来,发现技术对于业务多数时候是过剩的。 为什么? 因为很多技术在实际的业务场景中无用武之地。 或者是因为技术成本,又或者因为没有发现技术的价值。 技术以业务为本。

相关推荐
向前看-3 小时前
验证码机制
前端·后端
Data跳动5 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
Java程序之猿6 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
来一杯龙舌兰7 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
AskHarries7 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion8 小时前
Springboot的创建方式
java·spring boot·后端
Yvemil78 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
zjw_rp8 小时前
Spring-AOP
java·后端·spring·spring-aop
节点。csn8 小时前
Hadoop yarn安装
大数据·hadoop·分布式