什么是分布式架构

article/2025/9/11 18:26:01

一、分布式架构定义

什么是分布式架构

分布式系统(distributed system) 是建立在网络之上的软件系统。

内聚性:是指每一个数据库分布节点高度自治,有本地的数据库管理系统。

透明性:是指每一个数据库分布节点对用户的应用来说都是透明的,看不出是本地还是远程。

在分布式数据系统中,用户感觉不数据是分布的,即用户不须知道关系是否分割,有无副本,数据存在于那个站点以及事物在哪个站点上执行。

简单来说:在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。

假设原来我们有一个系统,有100万行代码。现在拆分成20个小系统,每个小系统仅剩5万行代码。

原本代码之间都是直接基于Spring框架走JVM内存调用,现在拆分后,将20个小系统部署在不同的机器上,然后基于分布式服务框架(比如dubbo)搞一个rpc调用,接口与接口之间通过网络通信进行请求和响应。

所以分布式系统之间最重要的特点就是服务间要跨网络进行调用,我们来看下面的图:

此外,分布式系统大概可以分成两类。

1.底层的分布式系统

比如hadoop hdfs(分布式存储系统)、spark(分布式计算系统)、storm(分布式流计算系统)、elasticsearch(分布式搜索系统)、kafka(分布式发布订阅消息系统)等。

2、分布式业务系统

分布式业务系统将原来用java开发的一大块系统,给拆分成多个子系统,多个子系统之间互相调用,形成一个大系统的整体。

举个例子,假设原来做了一个OA系统,里面包含了权限模块、员工模块、请假模块、财务模块等,一个工程,里面包含了一堆模块,模块与模块间会相互调用,1台机器部署。

现在你将这个系统拆分为,权限系统、请假系统、员工系统、财务系统,4个系统,4个工程,分别在4台机器上部署。

然后用户一个请求过来,要完成这个请求,员工系统去调用权限系统,调用请假系统,调用财务系统,4个系统分别完成了一部分事情。

最后4个系统都干完后,才认为这个请求已经完成,这就是所谓的分布式系统。

同样,我们画一张图,感受一下上述过程:

二、分布式架构的意义 

        有的朋友可能要问了,我一台服务器跑的好好的,所有系统一个工程全部搞定,多好。为啥一定要去搞什么分布式架构,互相调用还要走远程,似乎增加了不少工作量?

        下面我要以我曾经待过一个公司的血泪经历为例,来聊聊这个问题。

很多年以前,在没有走分布式架构的时候,我待的这家公司的整个业务都是垂直烟囱似的的项目。

        随着互联网的发展,公司的业务也在不断的发展,注册用户增加、网站应用的功能、规模在不断扩展,特别是移动互联网的发展,APP、微信、自助终端等访问渠道的增加,各种新业务,新需求不断涌入,系统遇到了各种各样的问题。

        首先是项目工程无节制的变得臃肿庞大,今天增加一个业务,明天扩展一个模块,系统复杂度增加,大几十万行代码,几十个开发人员,service层,dao层代码大量被copy使用,经常有各种代码合并冲突要处理,非常耗时间。经常是我改动了自己的代码,但别人调用了我的接口,导致他的代码也出现问题,需要重新测试,麻烦的要死。

        每次发布都是几十万行代码的系统一起发布,大家都提心吊胆准备上线,几十万行代码的上线每次要做很多检查,需要处理很多异常问题,每个人都高度紧张,被搞得几乎崩溃。

        而且我现在有个新业务,打算把相关依赖升级一下,比如升级到最新的spring版本,还不行,因为可能会导致别人的代码报错,不敢随便改技术。并且一个web工程每次启动都需要好几分钟时间,本地IDE里面调试一次代码都很痛苦。

        其次随着用户访问流量的增加,系统负载压力加大,变得不堪重负,通过增加实例数,增加硬件扩容能够带来的效果已经微乎其微,故障频发,效率低下。系统质量也越来越难以保证,测试周期也变得越来越长,无法满足公司业务的发展需要。

        以上就是以前待过的公司一些不堪回首的往事,总的来说,问题主要体现在以下几个方面:

        1、应用代码耦合严重,功能难以扩展;

        2、新需求开发交付周期延长,测试工作量大;

        3、新加入团队的成员需要很长时间才能熟悉系统;

        4、升级维护也很困难(改动任何一点地方都需要升级整个系统)

        5、系统性能提升艰难,可用性低,不稳定

好,既然已经深刻体会到系统耦合带来的痛苦,那么现在就来看看,系统拆分后带来的好处:

        百万行代码拆分成20个服务子系统,平均每个服务也就5万行代码,每个服务部署到单独的机器上,20个工程就用20个git仓库代码,20个开发人员,每个人维护自己那个服务就可以。

        1、自己维护自己的代码,再也不需要考虑代码冲突,爽;

        2、每次只需要测试自己的代码就好了,爽;

        3、每次修改后只需要发布自己的服务就可以,爽;

        4、技术上可以随心所欲的升级,保持接口定义不变,输入输出不变就好,还是爽;

        总结起来就一句话,拆分成分布式系统之后,可以大幅度提升复杂系统大型开发团队的效率。

三、系统如何拆分

        一般来说要将系统进行拆分,首先要对系统整体比较熟悉。可以采用多轮拆分的思路,第一次拆分就是将以前各模块粗粒度的拆分开来。

        比如一个电商系统就可以拆分成订单系统、商品系统、店铺系统、会员系统、促销系统、支付系统等。

        后面可能每个系统又变的复杂,比如说订单系统又可以拆分成购物车系统,库存系统,价格系统等。

        总的来说就是基于领域驱动设计的思想以及实战经验的总结,同时参考业界的一些常规做法,大家讨论进行拆分,逐步优化,多轮拆分,小步快跑,最终达到一个比较好的状态。

四、分布式之后带来的技术挑战

        首先就是分布式框架的选用,目前国内主流的还是dubbo和spring cloud。

        我们来思考一下,使用服务框架主要用来解决什么问题呢?如果不用dubbo和spring cloud是否可以做分布式架构呢?

        不用dubbo和spring cloud等服务框架当然也是可以的,但是这就需要自己处理很多事情了。比如,各个子系统走restful接口调用,那么就是http调用,这时比如传送过去一个对象,就要自己搞成一个json,然后一次调用失败后重试怎么做?

        另外,一般来说都是集群部署,目标系统有多个实例,那么自己还要写一个负载均衡算法,如何每次随机从多个目标机器中挑选一个来调用?

        还有,目标系统扩容新部署一个实例, 或者服务器故障下线了一个实例,如何动态让调用方感知到呢?诸如此类很多问题,如果不用服务框架的话,自己这么瞎搞,会遇到各种各样的问题。

俗话说的好站在巨人的肩膀上才能看的更远,有现成的技术不用白不用。

        上述过程,用一张图给大家呈现一下:

        如果选用某一个分布式框架,就需要深入掌握这个框架的使用与底层原理,比如dubbo就需要搞明白以下问题:

        1、dubbo的工作原理

        2、dubbo支持的序列化协议

        3、dubbo的负载均衡和高可用策略,动态代理策略

        4、dubbo的SPI思想

        5、如何基于dubbo进行服务治理、服务降级、失败重试以及超时重试

        6、dubbo服务接口请求的顺序性如何保证

        7、dubbo服务接口的幂等性如何设计(比如不能重复扣款、不能重复生成订单、不能重复创建卡号)

        8、如何自己设计一个类似dubbo的rpc框架

        使用spring cloud也一样,比如eureka的工作原理?feign申明式调用的原理?等等各种底层原理要搞懂。

        还有其他一些走分布式框架后常见的要解决的问题:

       分布式会话、分布式锁、分布式事务、分布式搜索、分布式缓存、分布式消息队列、统一配置中心、分布式存储、分库分表、限流、熔断、降级等。

        


http://chatgpt.dhexx.cn/article/qSWYbdfB.shtml

相关文章

分布式架构图解

一、分布式架构图解 1)传统servletjsp模式 2)分布式架构  需要按照功能点把系统拆分,拆分成独立的功能。单独为某一个节点添加服务器。需要系统之间配合才能完成整个业务逻辑。叫做分布式。  分布式架构:多个子系统相互协作…

分布式框架

应用架构 单一应用架构ORM 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。 适用于小型网站,小型管理系统,将所有…

juicer.js @each中的index 索引+1操作

问题描述:想在index1的值显示出来而不是做字符串拼接,如我做的楼号, 想显示2楼,3楼,4楼 解决方法:在index前加一个加号即可。 !{index1}楼 效果: 简单介绍juicer模板: Juicer 是…

Jmetercookie管理器

Jmeter中cookie自动存储 1,新建一个测试计划,然后添加一个"HTTP Cookie 管理器"(用来存储cookie) 2,新建一个线程组,添加一个Sampler-->“HTTP 请求”(用来登录用的),添加一个Samp…

利用3D-DNA流程组装基因组

利用3D-DNA流程组装基因组 使用二代数据或三代数据得到contig后,下一步就是将contig提升到染色体水平。有很多策略可以做到这一点,比如说遗传图谱,BioNano(看运气), HiC, 参考近源物种。 如果利用HiC进行准染色体水平,那么目前常见…

Hic-pro的结果文件转化为.hic文件,在juicebox中实现可视化

hic数据经过Hic-pro处理后,会生成allvalidpairs文件,这是所有有效配对的文件。一般想要可视化的话,比较复杂。这时我们就可以把它转化为.hic文件,放到juicebox中就很好的可视化。 juicer中的pre命令是用来做这个事情的。只要你的…

Java-juc

1. 进程和线程 进程: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个基本单位。例如:打开一个 .exe文件就是一个进程、打开360安全软件就是一个进程 线程 线程是进程的一个实体,是进…

Junit

Junit单元测试 简介:本文主要讲解,如何使用Eclipse,进行单元测试。 1.准备工作:搭建实验环境(EclipseJunitAnt) Eclipse:http://www.eclipse.org/ JUnit:http://www.junit.org/ Ant&#x…

juicer使用案例

代码结构&#xff1a; 编写main.html&#xff1a;引入方式可从bootcdn直接copy script标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge&…

juicer

UPDATE: juicer-0.3.1-dev published github.com. 让我们从一段代码说起&#xff0c;假设有一段这样的JSON数据&#xff1a; var json{name:"流火",blog:"ued.taobao.org" };我们需要根据这段JSON生成这样的HTML代码&#xff1a; 流火 (blog: ued.taoba…

Juicer软件的安装详解

欢迎关注”生信修炼手册”! 软件安装是生物信息实战中最基础的技能之一&#xff0c;只有确保软件安装无误&#xff0c;后续使用起来才会得心应手&#xff0c;不会有很多的bug。juicer软件提供了Hi-C数据一键化分析的pipeline, 这样高度的封装使得用户操作起来更加简便&#xff…

Juicer实战详解

欢迎关注”生信修炼手册”! Juicer软件的运行是非常简单的&#xff0c;只需要设置几个参数就可以了&#xff0c;本文利用官网的小的测试测试数据集来展示该软件的基本用法。 1. 下载测试数据 从以下链接下载测试数据集 https://github.com/aidenlab/juicer/wiki/Running-Juicer…

Juicer: 辅助基因组组装

Juicer: 辅助基因组组装 Juicer 导读 本文主要对处理HiC数据的Juicer程序进行一个简短的介绍&#xff0c;并展示如何利用Juicer进行基因组组装中染色体挂载的第一步。 1. 介绍 算法介绍 Juicer[1] 是一款能够提供一键式分析Loop-Resolution的程序。 特点 只需一次单击&#xff…

如何同步数据库数据

第一步 打开mysql的客户端 这里使用navicat&#xff0c;连接数据库&#xff0c;等到navicat主页面&#xff0c;双击需要操作的数据库连接 第二步 登录到数据库主页面后&#xff0c;点击左侧的数据库链接&#xff0c;打开数据库&#xff0c;可以看到可以操作的所有数据库 第三…

Logstash数据同步

Logstash 是 Elastic 技术栈中的一个技术&#xff0c;它是一个数据采集引擎&#xff0c;可以从数据库采集数据到 ES 中。可以通过设置 自增 ID 主键 或 更新时间 来控制数据的自动同步&#xff1a; 自增 ID 主键&#xff1a;Logstatsh 会有定时任务&#xff0c;如果发现有主键…

数据同步-数据库间的双向同步

当业务侧需要MongoDB降配、活动数据迁移时都需要应用切换数据库实例进行发版&#xff0c;发版过程中需最大程度保证新旧数据库数据一致&#xff0c;这就涉及到了一种同步技术-数据双向同步。在同步过程中遇到了一些可能会产生问题或引发思考的点&#xff0c;希望利用这篇文档进…

什么是数据实时同步,为什么数据实时同步很重要

随着云成为前所未有的数据供应渠道&#xff0c;数据准确性、一致性和隐私性的重要性与日俱增。看似轻微的数据错误或故障可能会产生重大负面影响。但是&#xff0c;​对数据进行排序并将其与现有​&#xff0c;然后定期解析数据实时同步&#xff0c;同时保持数据完整性&#xf…

数据同步工具的研究(实时)

数据同步工具的研究&#xff08;实时同步&#xff09;&#xff1a; FlinkCDC、Canal、Maxwell、Debezium ——2023年01月17日 ——Yahui Di 1. 常用CDC方案比较 2. FlinkCDC FlinkCDC的简介&#xff1a; Flink CDC 连接器是 Apache Flink 的一组源连接器&#xff0c;使用变…

聊聊数据同步

一、简述 数据同步&#xff0c;这是一个很宽泛的概念&#xff0c;在互联网或者传统软件公司&#xff0c;一定会遇到数据同步的场景。数据同步一般会遇到的问题诸如同步时延、数据一致性、性能低、强依赖于中间件、失败后无法补偿等。本文笔者试图简要总结下常见的数据同步场景&…

大数据的数据同步方式

一、全量覆盖 不需要分区&#xff0c;同步时直接覆盖插入。适用于数据不会有任何新增和变化的情况。比如地区、时间、性别等维度数据&#xff0c;不会变更或变更不影响业务&#xff0c;可以只保留最新值 二、仅新增同步 每天新增一个日期分区&#xff0c;同步并存储当天的新…