第 17 章 你的咖啡店不使用两阶段提交
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在队列中学习分布式系统设计!
格兰德、耐用、非原子、豆香拿铁
设计解决方案时,架构师通常会参考 ACID(原子、一致、隔离、持久)事务和二进制值 等技术解决方案,以精心设计一个定义明确的完美系统。但实际上,设计复杂系统并不那么容易,因此您还应该考虑一个设计指导来源:现实世界。1
Hotto Cocoa o Kudasai
当你去咖啡馆喝咖啡时,你会开始思考松散耦合系统之间的交互模式,这说明你是个极客。我在日本旅行时就遇到了这种情况。东京有许多星巴克咖啡店,尤其是在新宿和六本木地区,这些都是我比较熟悉的景象。在嘟囔了一句"Hotto Cocoa o Kudasai"("请给我一杯热巧克力"),让我有限的日语能力得到了锻炼之后,我回到了我的外国人世界,开始思考星巴克是如何处理饮料订单的。
星巴克与大多数其他企业一样,主要关注的是订单吞吐量的最大化,因为订单越多,收入就越多。有趣的是,吞吐量的优化导致了一种并发和异步处理 模式:当您下订单时,收银员会在咖啡杯上标注订单的详细信息(例如,中杯、脱脂、大豆、干杯、特热拿铁加双份),然后将其放入队列,队列实际上就是在意式浓缩咖啡机顶部排成一排的咖啡杯。这种排队方式将收银员和咖啡师分离开来,即使咖啡师一时忙不过来,收银员也能继续接单。如果店内生意繁忙,可以在消费者竞争的情况下部署多名咖啡师、2这意味着他们可以并行处理项目,而不会重复工作。
异步处理模式具有很高的可扩展性,但也并非没有挑战。在等待热巧克力的过程中,我开始思考星巴克是如何处理这些问题的。也许我们可以从这家咖啡店学到一些设计成功的异步消息传递解决方案的方法?
相关性
并行 和异步处理会导致饮料订单不一定按下订单的顺序完成。出现这种情况有两个原因。首先,订单处理时间因饮料类型而异:混合冰沙比基本滴漏式咖啡需要更多时间准备。因此,最后下单的滴漏式咖啡可能会先送到。其次,咖啡师可能会在一批咖啡中制作多种饮品,以优化处理时间。
因此,星巴克面临着一个相关性问题:必须将不按顺序配送的饮料与正确的顾客匹配起来。星巴克用信息架构中使用的相同 "模式 "解决了这个问题:相关标识符3对每条信息进行唯一标记,并贯穿整个处理步骤。在美国,大多数星巴克都使用明确的相关标识符,即在点餐时在杯子上写下你的名字,并在饮料准备好时叫出你的名字。其他国家可能会根据饮料的类型进行关联。当我在日本难以理解咖啡师叫出饮料种类时,我的解决办法是点超大杯的 "venti "饮料,因为它们不常见,因此很容易识别,也就是 "可关联"。
异常处理
异步消息传递场景中的异常处理 是另一个挑战。如果您付不起钱,咖啡店会怎么做?如果饮料已经做好,他们会把饮料扔掉,或者从 "队列 "中把你的杯子拿出来。如果他们提供给您的饮料不正确或不令人满意,他们会重新制作。如果机器发生故障,无法为您调制饮料,他们会退还您的钱。显然,我们可以从排队中学到不少处理错误的策略!
就像星巴克一样,分布式系统通常无法依赖两阶段提交语义来保证多个操作的结果一致。因此,它们采用相同的错误处理策略。
注销
最简单的错误处理策略就是什么都不做。如果错误发生在单个操作过程中,则直接忽略。如果错误发生在一系列相关操作中,则可以忽略该错误并继续后续步骤,同时忽略或丢弃迄今为止所做的任何工作。这就是咖啡店在顾客无法付款时的做法:丢弃饮料,继续前进。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access