﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-Distribute</title><link>http://www.blogjava.net/stevenjohn/category/54655.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Sun, 28 Dec 2014 14:54:07 GMT</lastBuildDate><pubDate>Sun, 28 Dec 2014 14:54:07 GMT</pubDate><ttl>60</ttl><item><title>CAP原理和BASE思想 </title><link>http://www.blogjava.net/stevenjohn/archive/2014/12/28/421903.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 28 Dec 2014 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2014/12/28/421903.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/421903.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2014/12/28/421903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/421903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/421903.html</trackback:ping><description><![CDATA[<div>分布式领域CAP理论，</div><div>Consistency(一致性), 数据一致更新，所有数据变动都是同步的</div><div>Availability(可用性), 好的响应性能</div><div>Partition tolerance(分区容错性) 可靠性</div><div></div><div>定理：任何分布式系统只可同时满足二点，没法三者兼顾。</div><div>忠告：架构师不要将精力浪费在如何设计能满足三者的完美分布式系统，而是应该进行取舍。</div><div></div><div>关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区：</div><div>Atomicity原子性：一个事务中所有操作都必须全部完成，要么全部不完成。</div><div>Consistency一致性. 在事务开始或结束时，数据库应该在一致状态。</div><div>Isolation隔离层. 事务将假定只有它自己在操作数据库，彼此不知晓。</div><div>Durability. 一旦事务完成，就不能返回。</div><div>跨数据库事务：2PC (two-phase commit)， 2PC is the anti-scalability pattern (Pat Helland) 是反可伸缩模式的，JavaEE中的JTA事务可以支持2PC。因为2PC是反模式，尽量不要使用2PC，使用BASE来回避。</div><div></div><div>BASE模型反ACID模型，完全不同ACID模型，牺牲高一致性，获得可用性或可靠性：</div><div>Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库)</div><div>Soft state软状态 状态可以有一段时间不同步，异步。</div><div>Eventually consistent最终一致，最终数据是一致的就可以了，而不是时时高一致。</div><div></div><div>BASE思想的主要实现有</div><div>1.按功能划分数据库</div><div>2.sharding碎片&nbsp;</div><div></div><div>BASE思想主要强调基本的可用性，如果你需要High 可用性，也就是纯粹的高性能，那么就要以一致性或容错性为牺牲，BASE思想的方案在性能上还是有潜力可挖的。</div><div></div><div>现在NoSQL运动丰富了拓展了BASE思想，可按照具体情况定制特别方案，比如忽视一致性，获得高可用性等等，NOSQL应该有下面两个流派：</div><div>1. Key-Value存储，如Amaze Dynamo等，可根据CAP三原则灵活选择不同倾向的数据库产品。</div><div>2. 领域模型 + 分布式缓存 + 存储 （Qi4j和NoSQL运动），可根据CAP三原则结合自己项目定制灵活的分布式方案，难度高。</div><div></div><div>这两者共同点：都是关系数据库SQL以外的可选方案，逻辑随着数据分布，任何模型都可以自己持久化，将数据处理和数据存储分离，将读和写分离，存储可以是异步或同步，取决于对一致性的要求程度。</div><div></div><div>不同点：NOSQL之类的Key-Value存储产品是和关系数据库头碰头的产品BOX，可以适合非Java如PHP RUBY等领域，是一种可以拿来就用的产品，而领域模型 + 分布式缓存 + 存储是一种复杂的架构解决方案，不是产品，但这种方式更灵活，更应该是架构师必须掌握的。&nbsp;<br /><br /><br /><br /><div>http://www.jdon.com/37625</div></div><div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/421903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2014-12-28 22:51 <a href="http://www.blogjava.net/stevenjohn/archive/2014/12/28/421903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>