知识卡片
咖啡店的关联标识:解决分布式系统的乱序响应
内容
星巴克采用并行异步订单处理:收银员接单后把杯子放入队列,与后台咖啡师制作解耦,咖啡师积压时可调配更多人手并行处理(竞争消费者模式)。但异步处理不保证按下单顺序完成(不同饮品耗时不同、同一咖啡师可能同时做多份),因此需要把饮品和顾客重新关联起来——星巴克用”在杯子上写名字”作为唯一关联标识,这正是消息传递架构里每条消息携带关联ID的模式。发散:任何引入异步/并行处理的系统,一旦处理顺序不再等于到达顺序,就必须显式设计一个关联标识,而不能依赖隐式的处理顺序。
结构图:
flowchart LR
O["下单"] --> Q["队列(前台/后台解耦)"]
Q --> B1["咖啡师1"]
Q --> B2["咖啡师2(竞争消费者,并行)"]
B1 --> R["完成但顺序已乱"]
B2 --> R
R -->|关联标识=杯上姓名| C["正确交付给顾客"]
参考来源
- 位置:《架构师应该知道的37件事》第2章《架构》之"2.1 咖啡店不使用两段式提交法"·"2.1.1 请给我一杯热拿铁"与"2.1.2 关联"(源文件:_epub-src/OEBPS/Text/chapter002.html)
- 结论依据:原文说明"这个队列把前台收银员和后台咖啡师分离开来……当订单量太大时,可以调配更多的咖啡师过来,形成竞争消费者的场景……星巴克使用了关联标识来解决这个问题,这正是消息传递架构所使用的'模式':在整个处理流程中,每条消息都带有唯一的关联标识",直接支撑本卡结构图。
- 原始内容:在美国,大多数星巴克咖啡店会在接单时,在咖啡杯上明确写上顾客的名字,以此作为关联标识。在饮品制作完毕后,只需大声呼喊杯上的名字即可。