所谓分布式系统,是指硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。我们从这个定义中可以看出分布式系统包含两个区别于单块系统的本质性特征,一个是网络,分布式系统的所有组件都位于网络之中,对于互联网应用而言,则位于更为复杂的互联网环境中;另一个是通信和协调,与单块系统不同,位于分布式系统中的各个组件只有通过约定、高效且可靠的通信机制进行相关协作才能完成某一项业务功能。这是我们在设计和实现分布式系统时首先需要考虑的两个方面。下图展示的就是从软件开发视图出发得到的一个典型的分布式系统,包含了分布式服务、消息中间件和分布式缓存等常见的用于构建分布式系统的技术实现方式。显然,这些工具位于一个封闭或开放的网络环境中,相互之间通过服务的注册和发现、消息传递、数据的缓存共享等机制完成协作。

在分布式系统中,我们为了打破单块系统中集中式的系统架构,引入系统拆分的思想和实践。拆分的需求来自组织结构变化、交付速度、业务需求以及技术需求所引起的变化,一般认为系统拆分的基本思路有两种,即纵向(Vertical)拆分和横向(Horizontal)拆分。

所谓纵向拆分,就是将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的应用系统即可。如下图中,我们可以将移动医疗系统中的预约挂号业务拆分成订单、医院和用户等独立业务子系统。纵向拆分关注于业务,通过梳理产品线,将内聚度较高的相关业务进行剥离从而形成不同的子系统。

相较纵向拆分的面向业务特性,横向拆分更多关注于技术。通过将可以复用的业务拆分出来并独立部署为分布式服务,只需调用这些分布式服务即可构建复杂的新业务。所以,横向拆分的关键在于识别可复用的业务,设计服务接口并规范服务依赖关系。横向拆分的的基本实现方式是构建分布式服务体系,下图是对上图中的预约挂号业务进行横向拆分的结果。可以看到,当我们把订单、医生、号源和用户等业务抽象成独立的垂直化服务,并在各个服务上层实现分布式环境下的调用和管理框架,系统的业务就可以转变为一种排列组合的构建方式。如基于订单和支付服务,我们可以构建出业务1,而业务2可能只依赖于医院和用户管理服务。分布式服务框架提供了一种按需构建的机制,在保证各个分布式服务的技术、团队、交付独立发展的前提下,确保业务整合的灵活性和高效性。

然而,分布式系统相较于集中式系统而言具备优势的同时,也存在一些我们不得不考虑的特性,包括但不限于:

1. 网络传输的三态性

构建分布式系统依赖网络通信,而网络通信表现为一个复杂且不可控的过程。相比与单机系统中函数式调用的失败或者成功,网络通信会出现“三态”的概念,即成功、失败与超时。由于网络原因,消息没有成功发送到接收方,而是在发送过程就发生了丢失现象;或者接收方处理后,响应给发送方的过程中发生消息丢失现象。这些问题都会增加通信的代价,如何使通信的代价降到用户可以忍耐的层次是分布式系统设计的重要目标。

2. 异构性

相较单块系统,分布式系统由于基于不同的网络、操作系统、软件实现技术体系,必须要考虑一种通用的服务集成和交互方式来屏蔽异构系统之间的差异。异构系统之间的不同处理方式会对系统设计和开发带来难度和挑战。

3. 负载均衡

在集中式系统中,各部件的任务明确。但是分布式系统是多机协同工作的系统,为了提高系统的整体效率和吞吐量,必须考虑最大程度发挥每个节点的作用。负载均衡是保证系统运行效率的关键技术。

4. 数据一致性

在分布式系统中,数据被分散或者复制到不同的机器上,如何保证各台主机之间的数据一致性将成为一个难点。因为网络的异常会导致分布式系统中只有部分节点能够正常通信,从而形成了网络分区(Network Partition)。

5. 服务的可用性

分布式系统中的任何服务器都有可能出现故障,且各种故障不尽相同。而运行在服务器上的服务也可能出现各种异常情况,服务之间出现故障的时机也会相互独立。通常,分布式系统要设计成允许出现部分故障而不影响整个系统的正常可用。

以上问题是分布式系统的基本特性,我们无法避免,只能想办法进行利用和管理,这就给我们设计和实现分布式系统提出了挑战。

如果对文章感兴趣,可以关注我的微信公众号:程序员向架构师转型,或扫描下面的二维码。

我出版了《系统架构设计:程序员向架构师转型之路》、《向技术管理者转型:软件开发人员跨越行业、技术、管理的转型思维与实践》、《微服务设计原理与架构》、《微服务架构实战》等书籍,并翻译有《深入RabbitMQ》和《Spring5响应式编程实战》,欢迎交流

分布式系统的基本特征相关推荐

  1. 7 Distributed System notes:A feature of distributed system - Transparency (分布式系统的透明性特征)

    以前对分布式系统透明性特征的理解比较模糊,甚至相左.现在来重新理解.陈述地总结一下.首先,我们对透明性做一个通俗的解释.透明性是把事物复杂的细节和特点进行隐藏,也可以简单地理解为通过抽象化或封装的手段 ...

  2. 分布式系统互斥性与幂等性问题的分析与解决

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:zdy0_2004 blog.csdn.net/zdy0_2 ...

  3. 分布式系统中只有两个难题

    分布式系统抽象 讨论编程语言时,我们使用通用术语并用函数.运算符.类.变量和指针来定义我们的程序.通用的词汇可以帮助我们避免每次都为了描述某些东西而发明新词.我们的定义越精确.越没有歧异,听众也就越容 ...

  4. 《分布式系统:概念与设计》一3.2 网络类型

    3.2 网络类型 本节介绍主要用于支持分布式系统的网络类型:个域网.局域网.广域网.城域网以及它们的无线变体.互连网络(如互联网)是基于这些类型的网络构造出来的.图3-1给出了下面讨论的各种网络的性能 ...

  5. 分布式系统上下层概念抽象-(2)

    前情回顾 在上一个博客中已经讨论了分布式系统的第一章节,主要涉及了分布式系统的基本概念,基本特性,设计目标,以及设计技巧.简言之,由于分布式系统的两个基本限制:信息的有限速度传播以及故障的独立性,导致 ...

  6. 深入分析分布式系统中互斥性与幂等性问题

    本文来源:tech.meituan.com 前言 随着互联网信息技术的飞速发展,数据量不断增大,业务逻辑也日趋复杂,对系统的高并发访问.海量数据处理的场景也越来越多.如何用较低成本实现系统的高可用.易 ...

  7. 分布式系统(Distributed Systems)概述

    随着互联网的持续发展(以Web应用为代表).计算机应用的深入.分布式系统构建技术的日益成熟,分布式系统逐渐深入到人们的日常生活,并渗透到社会.经济.文化生活的各个方面.现如今,分布式系统已成为主流的软 ...

  8. DDIA - 第8章 分布式系统的挑战

    文章目录 第8章 分布式系统的挑战 1 故障与部分失效 1.1 云计算和超算 2 不可靠的网络 基于不可靠的组件构建可靠的系统 2.1 现实中的网络故障 2.2 检测故障 2.3 超时与无限期的延迟 ...

  9. (推荐)关分布式系统的几个核心问题

    更多内容关注微信公众号:fullstack888 本文是作者在 FLOPS 2022 会议上的演讲,重点分享了使用Liquid Haskell语言集成验证系统来构建可靠的分布式系统的有趣的探索经历. ...

  10. 数据密集型应用系统设计-第七章分布式系统的麻烦-笔记

    这阵子在看数据密集型应用系统设计书籍,自己把书籍比较重要的内容整理出来,基本一天一更,请感兴趣的朋友多多关注! 整个系列会在这几天都发布出来,可以关注一下 链接: 数据密集型应用系统设计-笔记. 文章 ...

最新文章

  1. sql server几种读写分离方案的比较
  2. 1000行python代码_GitHub - kill1000/LearnPython: 以撸代码的形式学习Python
  3. Redisson官方文档 - 目录
  4. log4j配置使控制台能打印出hibernate生成sql的参数
  5. 漫画:什么是机器学习
  6. 中国人使用计算机互联网,发明计算机的核心专家,被美国隐瞒35年,只因是一名中国人...
  7. php进程池不释放,php-fpm 进程池优化方法
  8. sublime text3 错误解决
  9. 锐捷客户端linux安装,锐捷smp客户端安装(linux)
  10. coreseek4.1
  11. [STM8L15x]输入捕获获取PWM占空比
  12. ubuntu安装mplay
  13. 智慧校园中教务管理系统功能需求思路设计分享来自博奥智源
  14. 不修改vender文件夹,重写laravel注册登录功能
  15. 启动虚拟机sd 0:0:0:0: [sda] Assuming drive cache: write through错误解决 本人实测!
  16. 儿童卡通城堡banner动画
  17. 大于3小于4的整数bleem_六年级数学小升初知识点梳理
  18. SAP ERP统驭科目
  19. 大学计算机基础知识手写笔记,清华学霸手写笔记火了,如同“电脑打印版”,学渣快来“瞻仰”...
  20. 2022网络教育计算机统考-演示文稿操作题

热门文章

  1. 百度站长俱乐部SEO提问收集-7
  2. 3.30华为笔试第三题
  3. Java历史版本官方下载地址(Java 6、Java 7)
  4. R语言文本聚类实例——以《金庸全集》为例
  5. java代码做一个电子表
  6. 雷神开机logo更改_开机logo以及两种修改开机动画方法
  7. 只需三分钟小白也能学会!新手做自媒体,音乐拼接一晚200多
  8. 《模拟电子技术》–童诗白
  9. android 文件管理 显示缩略图,如何创建从Android视频文件路径视频缩略图
  10. Eclipse SVN插件Subversive的使用(分支,合并,同步,切换)