`
liuwei1981
  • 浏览: 770688 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:160903
社区版块
存档分类
最新评论

星巴克不适用两阶段提交 Gregor Hohpe 之 异常处理

阅读更多

      在异步消息处理的模式中,异常处理是个难点。如果您相信实践出真知的话,那么不妨参考一下星巴克是如何处理异常的:如果您无法付账,那么他们会在饮料已经冲调完成的情况下把饮料倒掉,否则就直接吧杯子从队列中拿出来;如果他们把饮料弄错了,或者您觉得不合口味,那么他们会为您重新冲调;如果机器坏了,他们根本无法冲调咖啡,那么他们会把钱退给您。上述的每一个场景都描述了一种不同但十分有趣的异常处理策略:

 

一笔勾销  这种对错误的处理策略最为简单:什么也不做,或者将已经做完的全部作废。尽管听上去不是什么好主意,但在现实中这种做法还是可以接受的。如果损失不大,那么建立一种纠错方案所花费的代价可能要比就此罢休更加高昂。以我曾经工作过的几家ISP供应商为例,在处理计费/服务周期不一致的问题时,他们采用的就是这个办法。他们的客户有可能在被收费之前就把服务取消,但由于这种损失不大,所以不会影响到公司的正常运营。他们会定期根据报表查出这些“免费”的帐户,然后将其关闭。

 

重试   当操作集合(也就是“事务”)中的某一步失败时,我们有两种选择:一个就是将所有完成的操作撤销;而另一个则是重试失败的那步操作。如果失败的操作重新提交后确实有成功的可能,那么重试还是一个不错的选择。例如,如果失败的原因是违反了业务规则,那么重试就不太可能管用;而如果失败的原因只是外部的系统暂时不可用,那么重试则是很有可能成功。此外,采用Idempotent Receiver的重试方案是一个特例。在这种情况下,我们可以简单的将所有的操作重新提交,因为 Idempotent Receiver 会忽略重复的消息。

 

补救   最后一个选择就是把所有已经完成的操作撤销,并将系统恢复到原先的状态。这种“补救措施”很有效,例如在处理财务系统遇到问题时,我们可以把已经扣的钱重新存到帐户上。


      而两阶段提交不同于上述这些策略,它需要依赖互相分离的准备阶段与执行阶段。还是以星巴克为例,如果他们采用两阶段提交,哪么顾客需要把钱放在收银台上并等在那里,而收银员则需要把收据准备好;然后冲调师再把冲调完成的饮料也放在收银台之上;最后大家在一瞬间同时出手,交换钱、收据和饮料。无论是收银员还是顾客,在“事务”完成之前都不能离开。这种两阶段提交方式一定会让星巴克破产,因为该方法必然使得他们在单位时间内接待顾客的数量急剧下降。这个例子很好的说明了,尽管两阶段提交能把生活变得十分简单,但是由于它要求在多个异步操作的序列间维持事务资源的一定状态,因此,它阻碍了消息的自由传递(也就等于损害了可伸缩性)。

分享到:
评论

相关推荐

    Enterprise Integration Patterns

    "竞争消费者"模式允许多个消费者并行处理消息,而"两阶段提交"和"补偿事务"模式则是解决跨系统事务一致性问题的方法。 8. **错误处理与恢复** "死信队列"和"重试机制"是应对错误和异常的关键策略。死信队列可以...

    Gregor06_Concepts.pdf

    《Gregor06_Concepts.pdf》是一篇由多位在IT领域有着深厚背景的研究者共同撰写的论文,包括来自Indiana University的Douglas Gregor、Andrew Lumsdaine,Texas A&M University的Jaakko Järvi、Bjarne Stroustrup、...

    gregor语义发布调试

    "Gregor语义发布调试"通常是指使用Gregor来处理项目的版本控制,并在遇到问题时进行调试的过程。在这个主题下,我们将深入探讨语义发布、Gregor的工作原理以及如何进行有效的调试。 语义发布是一种遵循特定规则的...

    gregor:Apache Kafka的轻量级Clojure绑定

    `gregor`封装了Kafka的错误处理,当出现网络中断或其他问题时,会抛出适当的异常,帮助开发者快速定位并解决问题。同时,它还提供了一些实用工具,如重试策略和回退机制,以增强系统的健壮性。 5. **线程模型和...

    Apache Camel中文开发使用指南.zip

    4. **错误处理与事务管理**:Camel允许设置错误处理器来捕获并处理异常,比如使用`onException()`来定义全局或特定路由的错误处理策略。此外,它还支持基于XAPolicy的事务管理,确保消息传递的原子性和一致性。 5. ...

    MuleESB 3.0 中文 教程. 理论实例

    EIP是由Gregor Hohpe和Bobby Woolf编写的著名书籍,书中概述了一系列最佳实践,这些实践被广泛应用于现代企业级应用的集成场景之中。Mule的核心理念在于提供一个灵活、高效且易于使用的整合平台。 #### 二、MuleESB...

    Apache Camel_ Enterprise Integration Patterns.pdf

    它支持大量的企业集成模式 (EIP),这些模式由 Gregor Hohpe 和 Bobby Woolf 在他们的著作《企业集成模式》中提出。本书详细介绍了各种集成场景下的最佳实践,旨在帮助开发者设计出高效、可靠的企业应用。 #### 关键...

    Enterprise Integration Patterns.chm

    《企业集成模式》是信息技术领域中的一本经典著作,由Gregor Hohpe和Bobby Woolf合著,深入探讨了在大型企业系统间进行有效集成的各种策略和设计模式。这本书是商业资料的重要组成部分,对于理解和实施企业级系统...

    event-streaming-patterns:事件流模式的集合,包括问题陈述、解决方案和实现示例

    事件流模式该存储库包含一组基于 Gregor Hohpe 和 Bobby Woolf 的松散的事件流模式。 模式分为功能类别并提供描述、解决方案、示例代码和参考。 您可以在 Confluent Developer 站点上查看这些模式的实时版本: : ...

    使用.NET的企业解决方案模式

    这份文档由多位来自微软及其他知名公司的专家共同编撰,包括David Trowbridge、Dave Mancini、Dave Quick、Gregor Hohpe、James Newkirk以及David Lavigne等。它不仅覆盖了.NET框架的理论知识,还提供了实际应用中的...

    MuleStudio用户手册.doc

    - **设计理念**:Mule 的设计基于《Enterprise Integration Patterns》(企业集成模式),这是一本由 Gregor Hohpe 和 Bobby Woolf 共同撰写的著作,书中详细介绍了企业应用集成的各种设计模式。 - **核心组件**:在...

    gregor:Go 中的简约 Kafka 克隆

    格雷戈尔Gregor是用 Go 编写的简约 Kafka 克隆。 仅用于教育目的,尚未努力保持与 Kafka 协议的完全兼容性。 除了 Go 之外,有几个部分可能看起来是 Kafka 的密切音译。 这没关系,不要惊慌。 呼吸,然后移动到另一...

    Java_Spring Integration提供了Spring编程模型的扩展,以支持众所周知的企业集成模式EIP.zip

    EIP 是 Gregor Hohpe 和 Bobby Woolf 合著的书籍中提出的概念,其中定义了多种模式,如Message Broker、Message Channel、Message Gateway等。Spring Integration 将这些模式转化为实际的API和组件,使得开发者能够...

    熟练C++用的书的顺序(不一定管用但试过比没试好)

    - **适用人群**:希望深入了解C++异常处理机制及如何正确管理资源的开发者。 #### Level 3:高级进阶 1. **《Inside the C++ Object Model》** - **作者**:Stanley B. Lippman - **简介**:这本书深入探讨了...

    gregor-foobar

    gregor-foobar

    gregor:球拍的日期和时间库

    Gregor:球拍的日期和时间库乔恩·泽皮里(Jon Zeppieri)< > 安装: raco pkg install gregor 使用方法: ( require gregor) Gregor是Racket的日期和时间库。 它提供: 用于表示日期和时间及其组合的数据结构...

Global site tag (gtag.js) - Google Analytics