专访开源项目Amoeba架构师陈思儒
DBA notes站长冯大辉(Fenng)代表InfoQ中文站采访了分布式数据库Proxy开源项目Amoeba的架构师和主要开发者陈思儒,内容包括Amoeba项目的起因、功能及其愿景等。
作者 Jean-Jacques Dubray译者 郭晓刚 发布于 2007年7月23日 下午12时6分
WS-TX,自2001年以来第三次尝试建立Web Service事务标准,在五月份获得批准成为了OASIS的正式标准。上周Evan H. 在MSDN分布式事务及服务论坛上提出的问题引发了一场争论:
分布式事务(即WS-Transaction)是否违背了面向服务架构的“自治”信条?
事务的目的是让两个或更多软件代理在合作完成一个工作单元的时候能够保持状态的一致,而无论该工作单元的执行结果是失败(由于业务或技术错误)还是成功。
事务标准通常由三个部分组成:
按照WS-TX的设计,上下文管理设施和协调设施担负着事务协调者的责任,另外WS-TX指定了两个事务协议:WS-AtomicTransaction(WS-AT)和WS-BusinessActivity(WS-BA)。
“[OASIS]技术委员会认识到不存在一个能够适应所有情况的事务模型,因此 WS-Transaction定义了一个可扩展的协调框架,既能够适应经典的两段式提交,也能够适应一些限制更宽松的事务,它们的隔离(isolation)行为做了调整,较适宜松耦合系统。”WS-TX工作组的联席主席 Ian Robinson说。
Choreology提供的《事务协议的分类》值得一读。按照其中的分类法,WS-AT属于“暂时先做再等确认(provisional-confirm)”类,而WS-BA属于“先实行再补偿(do-compensate)”类。请注意我认为WS-AT不满足ACID,因为WS-AT放宽了对隔离性的要求。WS-TX的目标就是让用户可在“暂时”与“彻底”之间选择需要的行为。
因此服务可在满足自治性的同时又能实现事务协议来协调该服务参与的工作单元。这是否会妨害可伸缩性呢?答案是肯定的,因为状态一致性是以在事务参与者和协调者之间交换额外的消息来达成的。
在MSDN论坛上的辩论集中在两个观点上: IDesign.net的首席架构师 Juval Löwy提出,在执行一个普通的工作单元时,如果牵涉到若干个软件代理,那么没有状态一致性我们就没法完成提交,而且为了达成状态一致性而重新发明特别的事务协议不一定是个好主意。他的观点是如果可行,采用原子性事务会比较好,因为它比较简单(请注意WS-BA为了达成事后补偿需要由协调者来管理一些特殊逻辑)。然而,如果你无法在工作单元的执行期间维持一个暂时状态(provisional state),那么你不得不采用其他协议,比如像WS-BA这样的“do-compensate”协议。必须权衡的是只有在你能够“容忍误差”的情况下这个协议才可行。
另一方面,Roger Sessions、Ollie Richies、Ahmed Nagy和Arnon Rotem-Gal-Oz争辩说:
“跨服务的事务是糟糕的想法”……“你真的希望让事务在地理上相距甚远的多个服务、多个信任授权、以及异质的执行环境之间往返穿梭?我知道我不会这样做。”
他们都针对使用数据库锁来实现WS-AT提出了警告。Arnon提议我们应该用两个不同的名字来区分数据库级别的事务和所谓“长期运行的事务”。这种交互活动通常称为“Sagas”。
刚刚回到微软的Pat Helland(虽然他没有参与论坛里的讨论),在对比数据库事务和SOA事务的时候,作了一些澄清。
在数据库内部,当前事务提供了清晰干脆的“此刻”的含义,对数据意义的解释即着落在“此刻”。当你身处在事务中间,除非发起这次事务的当前正运行的应用程序改变了数据,否则一切都会维持原样。
在SOA中,我们都承认存在独立的机器。[即“自治”]
当系统A向系统B发送一条消息,消息中包含的数据会在发送前被解锁。这就意味着这个数据成了历史遗迹。系统B只能看到来自系统A的数据过去的样子。这就是这些不共享事务的独立系统的一个本质方面。
除了隔离性,Pat还认为在处理分布式事务的时候,强制一致性约束可能并不是最有效的办法:
我看到业界越来越愿意放宽一致性的要求,甚至超过我前面提到的程度。他们宁愿偶尔得到错误的数据,因为这样更划算。
许多公司声称他们从没用到事务协议和事务协调者来达成状态的一致性,但实际上他们用了,只不过不是符合XA的两段式提交事务协议。他们的系统通常会记录被调用的操作,以及操作的结果。在晚一点的时候,代理会执行清理工作,任何失败的操作都会被回滚。在这种情况下,由于不必在工作单元的执行期间增加与事务协议相关的额外通讯,因此可伸缩性获得了提高。“事务协议”实际上是离线进行的。我的一位朋友曾为一家大计算机制造商工作,他告诉我说当协调代理不能回复到满意的状态时,他们打算“贿赂用户“,让用户成为他们的事务协议的一部分,幸好,他们还没有遇到过这种状况!
总而言之,似乎在这场争论中每个人都是对的。WS-AT和WS-BA对SOA来说都是有效的事务协议。两者都不会破坏参与者的自治性。不过在使用WS-AT的时候,试得到完整的ACID性质是不明智的(WS-AT对此并不要求)。隔离性,即让一个操作调用不受到属于另一个工作单元的其他操作调用的影响,通常是非常昂贵的,而且是绝大多数伸缩性问题的来源。在数据库中,隔离性的实现一般是通过将处理收到的请求的过程进行某种形式的串行化,在SOA的世界里,这几乎总是不可接受的。Pat建议我们甚至应该更进一步放宽对一致性的要求,这也是一个正确的方向,因为当参与者是被动态地组织到任意工作单元的时候,要想强制实施业务规则也许是行不通的。这里强调了事务参与者的自治观念。不过状态一致性是SOA的基本,无论你打算如何实现它,你都需要把上下文管理设施、协调者以及操作调用协议(即事务协议)聚集到一起。
DBA notes站长冯大辉(Fenng)代表InfoQ中文站采访了分布式数据库Proxy开源项目Amoeba的架构师和主要开发者陈思儒,内容包括Amoeba项目的起因、功能及其愿景等。
作为三期系列文章的第二部分,本文延续了上一期内容,介绍了RichFaces,包括如何把RichFaces集成到之前提到的示例应用中、如何部署RichFaces porlet和RichFaces的多种特性和功能。
Amazon Web Services(AWS)的传道者Jeff Barr讨论了SimpleDB、S3、EC2、SQS、云计算、Amazon的不同服务如何与应用交互、AWS的起源、SimpleDB和微软SQL Server Data Services、AWS cloud的全球化、三月份的AWS停机。
Erlang的并发模型很有名,它的健壮性也很有名。但其他方面呢?在这篇文章里,Dennis Byrne演示了如何用Erlang建立内部DSL。
本视频主要以FreeWheel为例,对一个基于Rails的企业级应用进行了剖析。其中包括:FreeWheel的架构、部署、数据库的问题、REST API、敏捷开发过程、如何去写测试以及持续集成等等。
JavaFX显示了Sun的Java系列产品市场方向的一个重大转变。随着1.0版的即将发布,InfoQ以JavaFX预览版为参考,与Sun高级工程师Joshua Marinacci探讨了即将发布的1.0正式版。
本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。
没有回复
回复