分布式架构概述及设计

分布式架构概述及设计引言随着越来越多的人参与到互联网的浪潮来 曾经的单体应用架构越来越无法满足需求 所以 分布式集群架构出现 也因此 分布式搭建开发成为了 Web 开发者必掌握的技能之一 那什么是分布式呢 怎么实现分布式以及怎么处理分布式带来的问题呢 本系列文章是笔者对自身学习的总结 包含但不限于 Zookeeper Dubbo 消息队列 ActiveMQ Kafka RabbitMQ Nosql Redis Mong

引言

随着越来越多的人参与到互联网的浪潮来,曾经的单体应用架构越来越无法满足需求,所以,分布式集群架构出现,也因此,分布式搭建开发成为了Web开发者必掌握的技能之一。那什么是分布式呢?怎么实现分布式以及怎么处理分布式带来的问题呢?本系列文章就来源于对分布式各组件系统的学习总结,包含但不限于Zookeeper、Dubbo、消息队列(ActiveMQ、Kafka、RabbitMQ)、Nosql(Redis、MongoDB)、Niginx、分库分表MyCat、Netty等内容。作为跟大多数人一样的学习使用者,而非布道者,个人理解难免会有偏差或是其它错误,希望各位读者不吝指教。

正文

一、什么是分布式

简单的说,“分工协作,专人做专事”就是分布式的概念。就好比你是你们公司唯一的码农,那么前后端都需要你自己来开发(单体架构),但随着业务的增长,你确实忙不过来了,老板给你招来了一个前端,那么你就只需要专注后端开发就行了(分布式)。但是软件的分布式搭建远远不像现实例子中这么简单,需要考虑和处理很多方面的问题,我们先了解以下几个常见的概念:

  • 集群:你们公司业务增长的非常快,老板发现你一个后端忙不过来了,就又招了几个后端开发来协助你,这就是后端集群;再往后,发现前端也忙不过来了,又配备几个前端,就是前端集群。所以也不难看出,将应用拆分后,你可以有针对性地扩展单个服务,做成集群,这就是分布式的好处之一。
  • 节点:这个也非常好理解,一个服务就是一个节点,比如你就是后端集群中的一个节点,而集群本身也可以看成是整个应用的一个集群节点。
  • 副本:副本就是为服务和数据提供的冗余,保证高可用。
  • 中间件:为开发者提供便利,屏蔽复杂的底层的一类框架组件。如服务管理通信、序列化、负载均衡等组件。
    在这里插入图片描述
    上图就是一个简单的分布式架构,但并不是所有的应用一开始就要设计为分布式架构,因为一开始业务量并不大,没有必要耗费大量的时间和成本去完成一个分布式架构,甚至有可能到最后都用不上,因此在设计时我们应该遵循演进原则,由简入深。下面就来简单分析一下分布式架构的演进过程。

二、分布式架构的演化过程

单机版

将应用服务器和数据库服务器分离

搭建应用服务器集群

数据库读写分离

  • 数据如何同步以及同步延迟如何处理?
  • 应用层数据源的选择
  • 大数据查询搜索,可以引入搜索引擎
  • 避免每次访问直接到达数据库,可以引入redis等缓存数据库缓存热点数据

问题看似都解决了,但是每个数据库都存储的是同样的数据,随着业务继续扩大, 我们就不得不考虑对数据库做水平或垂直拆分:

  • 水平拆分:将同一个表中的数据拆分至多个数据库中
  • 垂直拆分:将不同业务的数据放到不同的数据库中
    在这里插入图片描述

应用拆分

演化至此,这样的架构就是一个成熟的分布式架构了,但是,架构还是会随着业务和技术的提升不停地演化;而此时你有没有发现这样的一个架构和冯诺伊曼结构很像呢!输入输出设备对应用户和服务之间的输入输出,数据库服务器就像是存储设备,而整个应用层就像是一个CPU(控制器、运算器)。所以,分布式架构可以简单的理解为将多台计算机组成的一台超级计算机。

三、分布式架构的设计

在设计分布式架构时,我们需要了解几个基本的概念。

  • 主流架构模型-SOA和微服务
  • CAP和BASE理论
  • DDD(领域驱动设计)

这些理论限于篇幅原因,这里就不展开详述,读者可自行查阅。下面主要来谈谈分布式架构的高可用设计。

分布式架构的高可用设计

在分布式架构中,常常面临的两个矛盾的问题是一致性高可用,这两个是无法同时满足的,那我们舍谁取谁呢?从用户的角度分析,我们宁可获取到旧数据,也不愿意等半天都打不开应用,所以常常是保证高可用,让数据达到最终一致性,那么如何设计高可用的分布式架构呢?主要从以下几个方面:

  • 搭建服务集群,提高负载,避免单点故障。尤其是特别重要的服务,如访问量较高的服务和核心服务(一旦挂掉就会导致整个应用不可用的服务)。
  • 应对灾难,搭建异地灾备,预防地区因发生地震、台风等自然灾害导致地区的集群服务器都不可用。
  • 接口限流以及服务降级。为防止过高的并发量造成服务器负载过高而出现故障,应对接口限流,同时,当某个或多个服务出现故障时,应当服务降级,避免拖累整个应用。比如支付时因网络故障等导致无法支付,但搜索商品和下单仍然可用。
  • 故障监控报警。
  • 服务的可伸缩性,易于水平扩张服务器数量。
  • 使用缓存降低数据库压力。
  • 使用CDN等加速静态资源的访问。

高可用的分布式架构需要考虑非常多的方面,针对不同的场景有不同的解决方案,而对于不同的公司而言也不需要一应俱全,需要在实践中多思考总结,根据自己的业务情况来设计。

总结

本文从理论层面讲述了分布式的基本概念、演化过程,以及设计,从宏观角度搞清楚分布式的起源以及分布式带来的一系列问题,也就能明白各项技术出现的原因以及应用的场景。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223163.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:43
下一篇 2026年3月17日 下午2:43


相关推荐

  • php guzzle并发,使用Guzzle并发请求接口

    php guzzle并发,使用Guzzle并发请求接口最近在重构官网 为了支持 SEO 整个项目的结构从采用 AngularJs 的单页面应用结构回归到 PHP 服务端渲染 问题来了 之前统一调用接口可以保证三端 APP PC 和移动 web 端 数据同步 现在如果是单独为 PC 端写一套业务逻辑 需要花费大量的时间精力 且后期维护可能比较困难 需要维护两处 因此为了最大程度上保证数据同步 决定在通过服务器中转请求原始数据接口 然后渲染页面 经过筛选最终选定了 Guzz

    2026年3月16日
    2
  • 纳米deepseek网页版登录入口常见技术问题有哪些?

    纳米deepseek网页版登录入口常见技术问题有哪些?

    2026年3月13日
    2
  • 通配符掩码的应用 ACL 访问控制列表

    通配符掩码的应用 ACL 访问控制列表ACL(AccessControlList)访问控制列表在作为数据包的过滤器以及在对指定的某种类型的数据包的优先级,起到了对某些数据包的优先级起到了限制流量的作用,减少了网络的拥塞。通配符掩码作为ACL中重要的一部分,是路由器在进行访问控制时必不可少的重要部件,那么什么是通配符掩码呢?通配符掩码:路由器使用通配符掩码与原地址或者是目标地址一起来分辨匹配的地址范围,在访问控制列表中,将通…

    2022年7月19日
    17
  • AI表情包生成工作流

    AI表情包生成工作流

    2026年3月15日
    2
  • 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    超全MyBatis动态SQL详解!( 看完SQL爽多了)MyBatis令人喜欢的一大特性就是动态SQL。在使用JDBC的过程中,根据条件进行SQL的拼接是很麻烦且很容易出错的。MyBatis动态SQL的出现,解决了这个麻烦。MyBatis通过OGNL来进行动态SQL的使用的。目前,动态SQL支持以下几种标签:1数据准备为了后面的演示,创建了一个Maven项目mybatis-dynamic,创建了对…

    2022年6月23日
    21
  • java线程池参数_java线程池参数设置原则,如何设置线程池参数比较合理?[通俗易懂]

    java线程池参数_java线程池参数设置原则,如何设置线程池参数比较合理?[通俗易懂]线程池的参数应该怎样设置呢?相信对于很多的人来说这也是一个比较难的问题,下面就让我们一起来解决一下,究竟应该如何设置线程池的参数才是最合理的吧!首先在设置参数的时候,有以下的几点是我们需要考虑到的!1、下游系统抗并发的能力多线程给下游系统造成的并发等于你设置的线程数例:假如,是多线程访问数据库,那么就得考虑数据库的连接池大小设置,数据库并发太多影响其qps,会将数据库打挂等问题。假如,是访问下游系…

    2022年5月3日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号