Scalability, Availability & Stability Patterns
在这个PPT中,你会发现大量词语在本站讨论过:
分布式缓存 ;数据网格计算;NoSQL;RDBMS;Http缓存如CDN 反向代理;CAP理论,并发模式(消息传递模式 软事务 内存 数据流并发 状态共享并发);分区;复制。EDA事件驱动架构;负载平衡;并行计算(MapReduce模式 Fork/Join模式)。
由于难得一见的全面,需要反复多看几次,理清头绪。我下面就逐步诠释一下:
(1)Scalability可伸缩性 ,可伸缩性 扣住“状态”这个关键词,2006年我就写了一篇状态对象:数据库的替代者 ,应该说当时已经隐约感觉到了状态这根主线,如今在这个PPT得到全面诠释,非常释然。状态又分为:
分区 Http缓存 RDBMS Sharding碎片 NoSQL 分布式缓存 ,数据网格,并发Concurrency.
其他
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已经结束,那就散了吧。