精华内容
下载资源
问答
  • 分布式设计

    2017-11-27 17:20:25
    分布式网站的架构设计思路文档,有助于了解需要采用的技术体系
  • 设计模式,分布式设计模式,Java设计模式,软件设计模式
  • 汽车电器系统结构的全分布式设计,张新丰,杨殿阁,通过定义分布指数分析了汽车电器系统结构演变及发展方向,并提出了一种全分布式的汽车电器系统结构。该系统是一个以骨干网和局域
  • #资源达人分享计划#
  • #资源达人分享计划#
  • #资源达人分享计划#
  • #资源达人分享计划#
  • #资源达人分享计划#
  • 通过Hadoop模拟实现客户流量统计(同一手机号码登录网站所消耗的上行流量总和和下行流量总和以及整体流量总和) 这里提供我的一个具体实现论文 内有代码
  • Golang分布式设计模式之-----分层设计

    千次阅读 2014-08-15 10:42:04
    提到分布式系统,我们会想到很多机器,分别部署着各自的服务,然后整体组成一个分布式系统。在这类系统中,分布式系统与...也正是如此,分布式系统的设计比常规的集中式系统要难的多。为了区别,我们称这种分布式系...

                提到分布式系统,我们会想到很多机器,分别部署着各自的服务,然后整体组成一个分布式系统。在这类系统中,分布式系统与常规的集中式系统存在着以下三个区别。(来自分布式算法导论)

    1、缺乏全局状态知识

    2、缺乏全局时间帧

    3、非确定性

             这三大特点也成为分布式系统设计的难点。也正是如此,分布式系统的设计比常规的集中式系统要难的多。为了区别,我们称这种分布式系统为,群体分布式。这种犹如社会群体。

            

             golang语言天生具有分布式的特点,其主要是基于协程与chan的概念。如果对golang不了解的人可以简单的去看看golang语言。

     

             有了golang语言,我们的可执行程序,也可以设计成分布式。一个可执行程序设计成分布式,这种分布式我们成为单体分布式。这种犹如,个体,存在着很多的部件。

     

             其与群体分布式的区别在于:

    1、由于在同一个可执行程序中,全局状态知识,是可以存在的。

    2、由于在同一个可执行程序中,全局时间帧,也是可以存在的。

    3、也存在着非确定性

     

             其实我们就经常与分布式打交道,其中最经典的有:tcp协议(点对点的通信),路由协议(包的传递过程)。这都是典型的分布式算法。

     

             那么OSI7层模型与tcp/ip模型都属于分层的设计模式。现在我们将此设计经验。借鉴到golang语言的开发过程中。

     

             下面我们以一个http流分析系统举例

            

    一、根据功能,划分成不同的层次。

            

             1)dump层:利用pcap进行抓包

             2)传输层:对包进行解析tcp信息

             3)流层:将tcp包进行组装成tcp流

             4)http层:对tcp流进行识别生成相应的http信息

     

    二、分层之后,进行接口的定义

             接口有几种方式

             1)采用func变量

                      这种情况一般以单个接口的时候

             2)采用interface

             这种情况对应于有多个func接口的时候

             3)采用chan

                      这种模式更多的适用于两个协程之间进行通信,我个人不建议做成模块之间的接口

     

    三、组装

             在main函数中,反向初始化

     

             1)初始化http模块

             2)初始化流层,并将http中的接口函数与流层对接

                      流层.Init(http.接口函数)

             3)初始化传输层,并将流层的接口与传输层对接

                      传输层.Init(流层.接口函数)

             4)初始化抓包层,并将传输层的接口与抓包层对接

                      抓包层.Init(传输层.接口函数)

     

             分层设计,可以归属于一种类似于流水线的处理模式。属于状态的简单转移。这种设计的好处,在于,各个模块之间的耦合性降低,各个模块自成一体。整个系统的测试、维护都变得简单。

     

     龚浩华

    月牙寂 道长

    qq 29185807

    2014年8月15日

    如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

    第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

     

    展开全文
  • 提出了分布式系统的各种问题,如互斥问题、死锁的预防和检测、处理机间的通信机制、可靠性问题、负载分配问题、数据管理问题及其可能的解决方案,并讨论了分布式系统设计在操作系统、文件系统、共享存储器系统、...
  • 排队系统利用分布式设计的思考

    千次阅读 2021-01-19 11:20:19
    分布式系统设计来进行设计排队系统。它有以下特点: 1、它具有一致性(Consistency)和事务完整性(Tansactions)要求不高。目的只是控制流量,所以如果一定程度的数据不一致的最糟结果只是进入顺序不一致,或者多...

    从分布式系统设计来进行设计排队系统。它有以下特点:

    1、它具有一致性(Consistency)和事务完整性(Tansactions)要求不高。

    目的只是控制流量,所以如果一定程度的数据不一致的最糟结果只是进入顺序不一致,或者多进入10%的用户,都是可以容忍的。

    2、延迟(Latency)尽量低。

    虽然不追求毫秒级的响应,但是系统处理的速度越快,对系统的压力也就越小。所以还是尽量低。

    3、流通量(Throughput)要求非常高。

    要能承受巨大请求压力。

    4、它对于数据丢失(Data Loss)可容忍。

    排队的数据本身有一定的临时性或者说时效性。极限情况下可以接受一定的数据丢失,也要优先保证系统可用。

    5、排队中的冗余(Fail Over)方案是必须的,要求可读写。

    但考虑到对一致性、事务完整性和数据丢失都有容忍度。所以排队系统在分布设计领域,还是相对容易一些。

    更多安全技术文章,请关注 “小道安全” 公众号,一起学习,一起进步。

    展开全文
  • 大型分布式网站架构设计 完整版 pdf 百度云链接
  • 分布式系统设计

    千次阅读 2018-07-16 22:32:55
    高可用分布式系统应该要考虑以下几个大点和一些小点,大点与小点之间其实有包含、有交集,只是为了方便分点论述才分类。 四个大点: 容错能力(服务隔离、异步调用、请求幂等性、分布式锁) 可伸缩性(有 / 无...

    高可用分布式系统应该要考虑以下几个大点和一些小点,大点与小点之间其实有包含、有交集,只是为了方便分点论述才分类。

    四个大点:

    • 容错能力(服务隔离、异步调用、请求幂等性、分布式锁)
    • 可伸缩性(有 / 无状态的服务)
    • 一致性(补偿事务、重试)
    • 应对大流量的能力(熔断、降级)

    两个小点:

    • 解耦(MQ)
    • 线程池

    四个大点论述:

    1、容错能力(服务隔离、异步调用、请求幂等性、分布式锁)

    何为容错能力:系统在不健康、不顺,甚至出错的情况下有能力 hold 得住,挺得住,还有能在这种逆境下力挽狂澜的能力;我们都知道,故障是必然会发生的,是正常的,是常见的,我们应该把处理故障的代码当成正常的功能做在架构里写在代码里。

    • 请求幂等:幂等并不是每次请求的结果都一样,而是一次和多次请求某一个资源应该具有同样的副作用,f(x) = f(f(x)),要做到幂等性的交易接口,需要有一个唯一的标识,来标志交易是同一笔交易,这个标识要能做到全局唯一。幂等还是比较容易实现的,比如对于转账交易(支付系统一定要保证幂等),最简单的就是每次请求都带有一个唯一标识id,比如一个请求(id,money),此id标识在数据库中能唯一确定一条记录;若因为网络故障客户端多次请求同一个转账交易(id,money),服务端必须保证只能有一次记录成功,对于其他重复请求应该给客户端明确的解析语义。我们一般保证幂等的判断是从数据库查询有没有相同id的记录,但是在分布式系统环境下,可能有问题,主从问题:两个相同的请求request1、request2时间间隔很短,request1请求过来的时候,查询从库发现没有对应记录,则request1开始操作插入主库record1,但是还没有同步到从库;此时request2查询从库(主从还未同步)也发现没有相同id的记录,准备插入有相同id的记录record2,这个时候request1成功插入record1,request2开始插入record2,数据库报错:唯一约束被破坏相关的异常日志;解决这个问题有两种方法:1、读写都强制走主库;2、采用分布式锁,考虑性能问题,一般都选2
    • 分布式锁:分布式系统一般都有多台机器,常规的多线程锁已经无法解决问题;最简单用redis实现:思路很简单,主要用到的redis函数是setnx()。首先是将某一任务标识名UniqueKey(能唯一识别一个请求的标识)作为键存到redis里,并为其设个过期时间,如果是同样的请求过来,先是通过setnx()看看是否能将UniqueKey插入到redis里,可以的话就返回true,不可以就返回false。
      • 分布式锁设计原则:
      •    互斥性,同一时间只有一个线程持有锁
      •    容错性,即使某一个持有锁的线程,异常退出,其他线程仍可获得锁
      •    隔离性,线程只能解自己的锁,不能解其他线程的锁
    • 服务隔离:是为了在系统发生故障时能限定传播范围和影响范围,即发生故障后不会出现滚雪球效应,从而保证只有出问题的服务不可用,其他服务还是可用的。
    • 异步调用:发送方发送请求后,接收方直接返回正在处理,通过轮询或者回调的方式返回结果;异步调用相比于同步调用的最大好处是可以快速相应客户端的请求,至于具体的请求结果,通过异步回调的方式发送给客户端,这种方式在服务端平均处理请求时间过长的业务场景下很好用,避免在高请求流量下的超时、阻塞等问题;

    2、可伸缩性(有 / 无状态的服务)

    • 无状态服务在程序 Bug 上和水平扩展上有非常优秀的表现,但是在一致性上却有劣势,事物总是相对的(个人此点能力不足,不足以论述)

    3、一致性(补偿事务、重试)

    • ACID :大家在买同一本书的过程中,每个用户的购买请求都需要把库存锁住,等减完库存后,把锁释放出来,后续的人才能进行购买。同一时间不可能有多个用户下单,订单流程需要有排队的情况,这样一来,我们就不可能做出性能比较高的系统来。
    • BASE :大家都可以同时下单,这个时候不需要去真正地分配库存,然后系统异步地处理订单,而且是批量的处理。因为下单的时候没有真正去扣减库存,所以,有可能会有超卖的情况。而后台的系统会异步地处理订单时,发现库存没有了,于是才会告诉用户你没有购买成功。
    • 强一致性(ACID)和高可用性(BASE)是对立,顾此失彼;因此,为了可用性,我们要讲业务中需要强一致性的动作和不需要强一致性的动作剥离开,对于非强一致性需求的动作,可以做补偿事务;我们应尽量设计更多非强一致性的业务
    • 由于网络等问题,一些请求无法确定是否成功,这个时候需要重试,即在此发送请求给服务端,希望服务端能确定的交易结果,重试一般通过定时任务扫表,将不是终态的记录查询出在此发请求。

    4、应对大流量的能力(熔断、降级、限流)
     

    • 熔断(慎用):如果系统中,某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用;熔断主要是应对流量引起的问题,弃卒保车,使服务处于关闭、半关闭状态,以保证部分业务成功,或者舍弃次要业务使主业务运行通畅;
    • 限流:熔断的一种,半开状态,只允许少部分的请求,其他的都拒绝,如果设计得当,被拒绝的请求,客户端会通过重试、补偿操作来完成;

      限流策略:
       1)计数器算法:设置一个计数器统计单位时间内某个请求的访问量,在进入下一个单位时间内把计数器清零,对于单位时间内超过计数器的访问,可以放入等待队列、直接拒接访问等策略
       2)漏斗算法:一个固定容量的漏桶,按照常量固定速率流出水滴;可以以任意速率流入水滴到漏桶;如果流入水滴超出了桶的容量,则流入的水滴溢出了,而漏桶容量是不变的。
       3)令牌桶算法:令牌将按照固定的速率被放入令牌桶中。比如每秒放10个。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。当令牌桶满时,新添加的令牌被丢弃或拒绝

      漏桶算法与令牌桶算法在表面看起来类似,很容易将两者混淆。但事实上,这两者具有截然不同的特性,且为不同的目的而使用。漏桶算法与令牌桶算法的区别在于,漏桶算法能够强行限制数据的传输速率,令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。需要注意的是,在某些情况下,漏桶算法不能够有效地使用网络资源,因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法结合起来为网络流量提供更高效的控制。
      使用:
             单机限流:google的guava令牌桶算法实现;
             集群限流:Redis的计数实现精确;

    • 降级:暂时牺牲掉一些服务,保障整个系统的服务。比如:如果服务器已经高负载,这个时候可以将一些不重要的操作给关闭,比如重试操作,因为服务器已经承受不住,这个时候再重试也没有多大效果,反而更加重服务端的压力,这个时候可以设置一个开关,将重试功能关闭;

    两个小点:

    1、解耦(MQ)

    在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使模块之间的耦合度尽量小。在软件架构设计中,模块之间的解耦或者说松耦合有两种,假设有两个模块A、B,A依赖B:

    1. 第一种是,模块A和模块B只通过接口交互,只要接口设计不变,那么模块B内部细节的变化不影响模块A对模块B服务能力的消费。 
      • 面向接口设计下真正实现了将接口契约的定义和接口的实现彻底分离,实现变化不影响到接口契约,自然不影响到基于接口的交互。
      • 模块A和B之间的松耦合,主要通过合理的模块划分、接口设计来完成。如果出现循环依赖,可以将模块A、B共同依赖的部分移除到另一个模块C中,将A、B之间的相互依赖,转换为A、B同时对C的依赖。
    2. 第二种是,将同步调用转换成异步消息交互。 
      • 比如在买机票系统中,机票支付完成后需要通知出票系统出票、代金券系统发券。如果使用同步调用,那么出票系统、代金券系统宕机是会影响到机票支付系统,如果另一个系统比如专车系统也想要在机票支付完成后向用户推荐专车服务,那么同步调用模式下机票支付系统就需要为此而改动,容易影响核心支付业务的可靠性。
      • 如果我们将同步调用替换成异步消息,机票支付系统发送机票支付成功的消息到消息中间件,出票系统、代金券系统从消息中间件订阅消息。这样一来,出票系统、代金券系统的宕机也就不会对机票支付系统造成任何影响了。专车系统想要知道机票支付完成这一事件,也只需要从消息中间件订阅消息即可,机票支付系统完全不需要做任何改动。
      • 异步消息解耦,适合那些信息流单向流动(类似发布-订阅这样的),实时性要求不高的系统。常见的开源消息队列框架有:Kafka、RabbitMQ、RocketMQ。

    2、线程池

    • 线程池:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间,且创建过多的线程会耗费系统资源,频繁的上下文切换也影响系统的性能。

    实战分析:

    1、降级

    分析项目一:三个系统,A、B、C;A负责下单菜品:aaa,B负责接受A的下单请求,比根据A传递过来的aaa查询C得到菜品的详情,然后在继续下单;我们可以看出如果C系统挂了,整个下单流程就挂了,无法下单了;如何降级?B将C的菜品数据也存一份,正常情况下用C的菜品查询(C的菜品数据实时性更好一点),如果C挂了,B就用自己存的菜品,作为一种临时方案,达到可继续下单的目的,毕竟不能因为一个查询系统挂了导致整个下单功能不能用,这就是一种降级处理~

    分析项目二:关闭重试机制;很多项目都有超时重试的机制,这种机制在服务已经负载过大、无法及时处理时,应当将重试逻辑关闭,避免因重试导致更严重的服务负担。

    分析项目三:控制入口访问权限,白名单可用,当服务负载过大,可以通过在入口(比如拦截器中进行控制)控制流量,比如只允许vip客户访问,通过添加白名单方式来实现。

    降级的手段总结:
    a. 拒绝部分请求:如下三种方式

    • 拒绝部分老请求:优先处理新请求
    • 优先级请求方式:下单的请求咱继续收,退款、查询等先拒绝吧
    • 随机丢弃

    2、高可用设计注意事项

    分析项目一:缓存,不要放在业务侧,要在数据源头设置,业务方只负责增删改;否则可能造成多个业务方的数据不一致;

    3、你做的是什么服务

    • IaaS:基础设施平台即服务:在IaaS层面,我们购买的是云主机、云硬盘、网络等等,是属于基础类的服务,然后我们也在上面部署操作系统、应用;
    • PaaS:平台即服务,到了PaaS,是购买平台,例如在IaaS层面,要部署一个数据库,需要有一个数据库的软件,然后部署在云主机里面,但是在PaaS,直接给你一个数据库,你不需要购买软件,直接购买的就是一个数据库;
    • SaaS:软件即服务。第三种就是SaaS软件及服务,我们直接在上面购买软件,不需要去考虑底层的云主机是什么类型的,也不要考虑它的数据库是什么类型,就可以直接用这个软件。

    举例:

    • IaaS:阿里云ecs
    • PaaS:阿里云rds
    • SaaS:阿里云IOT服务

    头脑风暴

    1、降级

    降级目的:保证核心服务可用、非核心服务部门可用或全不可用

    降级手段

    降级难点:如何判断需要降级?降级怎么自动恢复?阈值开关?

    2、熔断

    熔断目的:保证XXXXX

    熔断手段:有一个服务治理平台:可视化、配置变更下发

    熔断难点:如何判断需要降级?降级怎么自动恢复?阈值开关?熔断后请求直接返回failed但服务端会尝试放一个请求尝试,若超时继续熔断,否则尝试放一部分流量

    熔断怎么实现:请求入队列-->定时判断队列请求状态-->判断是否达到熔断的阈值、恢复的阈值

    3、灰度

    灰度目的:新版本发布后避免全局影响

    灰度手段:自定义流量分配策略

    4、全链路压测

    目的:稳定性、伸缩性、性能瓶颈

    手段:自定义流量分配策略

    关注指标:CPU、网卡流量、请求超时比例、QPS与预估比值

    展开全文
  • 分布式架构设计详细流程:主要讲解分布式架构的发展流程,分布式架构详细设计以及分布式架构设计过程中需要的组件
  • 分布式架构概述及设计

    万次阅读 多人点赞 2019-08-15 21:50:06
    随着越来越多的人参与到互联网的浪潮来,曾经的单体应用架构越来越无法满足需求,所以,分布式集群架构出现,也因此,分布式搭建开发成为了Web开发者必掌握的技能之一。那什么是分布式呢?怎么实现分布式以及怎么...

    引言

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

    正文

    一、什么是分布式

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

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

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

    单机版

    以商城为例,为了简单说明,这里就只列出用户、订单、配送服务。
    在这里插入图片描述
    如图,大部分应用最开始都是将应用和数据库放到一台物理机上提供服务,但随着访问量的提升,服务器负载越来越高,我们首先会优化代码、对机器做垂直扩容(内存、容量)等,但单台机器的性能是存在上限的,且对单机扩容的性价比会随着性能的提升越来越低,那我们就会想到增加服务器。

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

    在一开始,我们可能只会增加一台服务器,并将应用和数据库分离:
    在这里插入图片描述

    搭建应用服务器集群

    随着访问量的继续增加,单台应用服务器也无法满足需求了,我们就需要搭建应用服务器集群来对外提供服务了
    在这里插入图片描述
    但是,在搭建应用服务器集群之后,问题就出现了,用户在访问时,应该到哪个服务器上去?如何平均服务器压力?以及用户的session如何维护(A首先访问了1号应用服务器并登陆,但下次请求可能是去到2号服务器,但这台服务器上并没有用户的session信息)?
    我们可以在用户层和应用层之间加上一个负载均衡器来平衡服务器的负载,session可以采取同步的方式,或者增加单独的session共享服务器。

    数据库读写分离

    应用层的问题暂时解决了,但是此时数据库又顶不住了。那该如何做呢?只是简单的增加数据库的服务器拉提供存储和访问能力么?那肯定不行,这样数据就不一致了。所以我们需要将数据库分为读库和写库。查询请求都到读库去,而写入请求都到写库去。
    在这里插入图片描述
    但这样也存在几个问题:

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

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

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

    应用拆分

    业务继续增长,数据库达到瓶颈时可以继续增加服务器解决,但是应用层呢?也只是单纯的增加服务器么?基于二八原则,其实大部分访问量是集中在20%的功能上的,如果我们只是单纯的增加服务器,那么无疑会浪费掉许多的资源,所以我么会想到能不能针对这20%的应用做扩展呢?当然是可以的,只不过我们需要先将应用拆分为多个子系统(一般是根据业务):
    在这里插入图片描述
    随着应用拆分随之而来的问题是,公用的代码如何处理?各服务之间如何通信?公用代码我们不可能放到每个服务中去,而是应该提出来对外提供服务,同时服务之间的调用可以通过RPC或者HTTP方式来实现。

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

    三、分布式架构的设计

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

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

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

    分布式架构的高可用设计

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

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

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

    总结

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

    展开全文
  • 在IDF05(Intel Developer Forum 2005)上,Intel首席执行官...分布式开发的时代实际上早已悄悄地成为了时代的主流,吵得很热的云计算实际上只是包装在分布式之外的商业概念,很多开发者(包括我)都想加入研究云计算这
  • 大型分布式网站架构设计与实践,由阿里巴巴一线工程师亲自操刀,分布式学习不得不看的一本书
  • 分布式进阶(十七)分布式设计介绍

    万次阅读 2016-03-04 18:00:19
    分布式设计介绍 前言 分布式设计与开发在IDF05(IntelDeveloperForum2005)上,Intel首席执行官CraigBarrett就取消4GHz芯片计划一事,半开玩笑当众单膝下跪致歉,给广大软件开发者一个明显的信号,单纯依靠垂直...
  • 分布式架构设计

    2018-07-01 17:35:19
    分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计分布式架构设计...
  • 分布式系统架构设计

    万次阅读 2018-07-03 23:17:15
    主流架构模型 SOA架构和微服务架构SOA架构SOA全称(Service Oriented Architecture) 中文意思为 面相服务的架构,他是一种设计方法,轻重包含多个服务,服务之间通过相互依赖最终提供一系列的功能, 一个服务通常以...
  • 分布式系统设计理念

    千次阅读 2017-09-26 17:05:34
    如果最终设计出来的分布式系统占用了10台机器才勉强达到单机系统的两倍性能,那么这个分布式系统还有存在的价值吗?另外,即使采用了分布式架构,也仍然需要尽力提升单机上的程序性能,使得整体性能达到最高。所以,...
  • 东北大学分布式系统课设。
  • 一种面向分布式系统的程序设计模式 李慧霸
  • 分布式系统设计经典论文

    千次阅读 2019-03-22 09:15:07
    推荐几篇工业界分布式系统设计的论文。1. Google 经典的“三驾马车”The Google File System (2003):https://static.goo...
  • 分布式系统设计(经典书籍)

    热门讨论 2009-06-17 00:15:49
    提出了分布式系统的各种问题,如互斥问题、死锁的预防和检测、处理机间的通信机制、可靠性问题、负载分配问题、数据管理问题及其可能的解决方案,并讨论了分布式系统设计在操作系统、文件系统、共享存储器系统、...
  • 分布式系统架构设计思路分布式系统架构设计思路分布式系统架构设计思路分布式系统架构设计思路分布式系统架构设计思路
  • 大型分布式网站架构设计与实践.pdf <br/>《大型分布式网站架构设计与实践》主要介绍了大型分布式网站架构所涉及的一些技术细节,包括SOA架构的实现、互联网安全架构、构建分布式网站所依赖的基础设施、系统稳定...
  • 分布式应用系统通信时的统一授权,即基于AccessToken的授权与认证; ③ 分布式服务/系统通信时的两大方式(基于dubbo rpc协议和基于http协议的restful api实战)。   值得一提的是,这套中台系统由于讲解了...
  • 本书旨在全面介绍因特网及其他常用分布式系统的原理、体系结构、算法和设计,内容涵盖分布式系统的相关概念、安全、数据复制、组通信、分布式文件系统、分布式事务等,以及相关的前沿主题,包括web服务、网格、移动...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 544,946
精华内容 217,978
关键字:

分布式设计