可伸缩性, 可用性和稳定性模式

    技术2022-05-19  24

    由于难得一见的全面,需要反复多看几次,理清头绪。我下面 就逐步诠释一下: (1)Scalability可伸缩性 , 可伸缩性 扣 住“状态”这个关键词,2006年我就写了一篇状态对象:数据库的替代者 ,应该说当时已经隐约感觉到了状态这根主线,如今在这个PPT得到全面诠释,非常 释然。状态又分为: 分区 Http缓存 RDBMS Sharding碎片 NoSQL 分布式缓存 , 数据网格,并发Concurrency.

    PPT指出可 伸缩性 是没有免费午餐,需要在 以下因素权衡: 性能和可伸缩性 什么是 性能问题?如果你的系统对于一个用户访问还很慢,那就是性能问题; 什么是可 伸缩性 问 题?如果你的系统对一个用户来说是快的,但是在高访问量下就慢了。 延迟和吞吐量 你要为如下目标奋斗:用可接受的延 迟获得最大的吞吐量。 可用性和一致性 就是CAP原理,传统的集中式关系数据库只能获得CA。大量章节谈了 NoSQL , 本站已经相关介绍,基本都已经涵括。 状态 在状态方面,首先谈的是Http缓存,反向代理:Varnish squid Nginx mode_proyx这些都很热门,通过CDN在离客户端最近布置状态服务器。 页面静态化主要归纳为 Precompute content方面,很多人喜欢将动态页面静态化,变成html,通过引入AJAX异步,也是一种可 伸缩性 提 高手段,静态化实时性差,适合可以预先计算的页面,预先计算可以采取:朴素的crontab 或Java的Quartz框架,Gearman,hadoop云计算已经google的数据协议,亚马逊的Elastic MapReduce。通过设置http协议,使用客户端浏览器本地 缓存 , 加长http中失效期限,这些在国内被归纳为SEO范畴,也是可 伸缩性 一 个小章节。 (2)可用性这里意思应该是我们通常的可靠性概念,可用性包括复制Replication和失败恢复 failover(过去称为 集群 )。

    何为可用性?是99.999%在线运行。7x24全天候运行。PPT讲了failover的复杂性已经fail back。 Replication 复制性分Active复制(推)和Passive复制(拉),形式上分主从 双主 Tree和Buddy伙伴四种,这些技术是MySQL Oracle以及追求CP类 NoSQL 数据库采取的同步策 略。 主从Master-slave:主用来读写,可多个slave用来读;双主则是两个都用来读写;伙伴复制采取一对一结伴,类似 Weblogic的 集群 策 略。 (3)稳定性包括let it crash (Akaa框架) SEDA Throttling.

    其他 PPT将传统关系数据库和NoSQL 归 纳为Service of Record SOR模式,讲了水平垂直伸缩,RDBMS的Sharding碎片技术包括分区和复制。 文章认 为:ORM +富模型Rich domain model是一种反模式 ,会导致你就把精力浪费在照料数据库上。 避免方式是:重新思 考你的数据,什么时候你需要ACID,什么时候可以从最终一致性中获得好处?不同种类数据有不同的需求。见本站过去讨论:ORM已经 是过去的事情 文章认为除了关系数据库以外,对象数据库如db4o 以及集群 , 如Terracotta兵马俑 ehcach都属于ACID。 在缓存 概 念中,解释了什么是write-through,什么是write-behind,什么是缓存 的 Eviction驱逐策略 比如先进先出FIFO; 在message-passing模式中,提到了Erlang Scala的Actors模型,最早提出由1973的Carl Hewitt,他比传统的类Class概念更加符合OO 。 Actors 模式特点:share nothing;隔离轻量处理,通过消息通讯;异步且非堵塞,因为不共享就不用同步。每个Actor有一个邮箱。 在 Dataflow并发中提到,数据是On-demand, lazy装载懒加载数据(jdonframeowork通过domain events实现数据随用随取,见其PPT说明 ) 该PPT将domain events明确为EDA架构,当然还有我们讨论的CQRS。并对Event Sourcing事件源进行了说明,如果有事件记录,就无需ORM,只要持久化事件就可以。 总之,该PPT是对近期热点模式进行总结。值 得推荐一看。

    并发Concurrency部分: 共享状态的并 发,也就是多线程模型,.NET和java C都是多线程模型,使用锁来实现状态共享,问题是: 锁要么少了 要么多了,要么加错锁,加锁策略很讲究,加不好就死锁。使用JDK 5以上的java.util.concurrent.* 并发包。 使 用Actor模型,能够克服多线程模型以上缺点,Scala或基于Java的akka 还有Groovy的GPars都提供Actor模型,其他基于JVM的Actor模型产品有: • scalaz actors (Scala) • Lift Actors (Scala) • Scala Actors (Scala) • Kilim (Java) • Jetlang (Java) • Actor’s Guild (Java) • Actorom (Java) • FunctionalJava (Java) • GPars (Groovy) STM基于内存的事务 , 类似数据库事务 有 begin commit abort/rollback,能够嵌套组合。基于JVM的STM产品有: Akka (Java/Scala) • Multiverse (Java) • Clojure STM (Clojure) • CCSTM (Scala) • Deuce STM (Java) 在EDA架构中,包括下面几个方面: • Domain Events • Event Sourcing • Command and Query Responsibility Segregation (CQRS) pattern • Event Stream Processing • Messaging • Enterprise Service Bus ESB • Actors • Enterprise Integration Architecture (EIA) DDD原作者Evans对Domain events的认识是: 在过去几年中,一个概念越来越清楚:建立专门的模 型:Domain Events Domain Events表达了对实体状态在某个时候发生重要改变的事件,使用事件模式来解耦系统,Domain Events给了我们一个更加清晰表达模型。 本 站关于领域事件主要文章: Domain Events – 救世主 Domain Events异步应用 DCI,领域模型,领域事件的一些想法 关于Event Stream Processing可见 EDA: Event-Driven Architecture事件驱动架构 关于消息模 型,JMS是一种消息模式实现,主要有几种形式: • Publish-Subscribe • Point-to-Point • Store-forward • Request-Reply 具体产品有: RabbitMQ (AMQP) • ActiveMQ (JMS) • Tibco • MQSeries 关于ESB,曾经在SOA中讨论很多,主要产品有: • ServiceMix (Open Source) • Mule (Open Source) • Open ESB (Open Source) • Sonic ESB • WebSphere ESB • Oracle ESB • Tibco • BizTalk Server 关于CQRS,本站也有大量讨论,如:使用 CQRS重新考虑架构 等。

     

    再来最后一段,网格计算,PPT把它等同于云计算 了。 分 而治之Divide and conquer原理: 1.将独立任务task分成几个job 2.并行执行这些job 3.聚合综合这 些job处理结果,合成返回结果。 在计算过程中,可以实现: • Automatic provisioning自动配置 • Load balancing • Fail-over • Topology resolution 云计算产品有: Google MapReduce • Hadoop • GigaSpaces • GridGain 并行计算中重要概念UE: Unit of Execution执行单元,有以下: • Process • Thread • Coroutine • Actor SPMD模式:Single Program Multiple Data,为所有UE使用一个程序,使用UE的ID选择通过该程序的不同路径,保持UE之间显式交互。 Master/Worker模式有 很好的可伸缩性 , 天生负载平衡。工作队列。 Loop Parallelism循环并行模式专门对付循环,循环就是瓶颈,将循环变成并行。 当任务 Task之间关系很简单时,使用Fork/Join模式: Fork: 任务能够动态创建 Join: 任务之后可被中断,数据能被聚合。

     

    还有稳定性模式,健壮性 鲁棒性,有下列几种模式: • Timeouts • Circuit Breaker • Let-it-crash • Fail fast • Bulkheads • Steady State • Throttling Timeouts超时: 时刻注意要用 超时,如:Thread.wait(timeout) 线程超时 • reentrantLock.tryLock 锁超时 • blockingQueue.poll(timeout, timeUnit)/ offer(..) • futureTask.get(timeout, timeUnit) 这个很重要。 • socket.setSoTimeOut(timeout) 设定超时,就没有执着,就不会有硬伤,刚则易断,柔性无敌。 直 面崩溃,不要回避崩溃,管理它,处理过程监督,设立超级管理层,必要时,使用REST art 策略,分离应用错误和业务资源错误,校验,在开始计算前确保所有资源就绪,检查一下。使用日志记录跟踪。这些都和编程风格有关。 稳定性模 式应该不只这些,但是PPT已经结束,那就散了吧。


    最新回复(0)