事件驱动系统中的幂等性和可靠性:实用指南

事件驱动架构与幂等性的介绍

事件驱动架构的兴起

现代电子商务系统通常依赖于事件驱动架构来确保可扩展性和响应性。例如,当用户下订单时,诸如“订单已下”、“付款已处理”和“库存已更新”等事件会异步触发。

为什么幂等性在分布式系统中至关重要

分布式系统中,由于网络故障,事件可能会被重复或重试,导致诸如重复订单或库存调整错误等问题。幂等性确保多次处理事件的结果与处理一次的结果相同。

理解幂等性

什么是幂等性?

幂等性确保无论操作执行多少次,都具有相同的效果。例如,如果由于网络故障调用了两次“下订单” API,只应创建一个订单。

幂等性与其他容错机制的比较

幂等性关注在重试过程中的正确性,而像重试或断路器这样的容错机制处理故障,但可能无法防止重复。

实现幂等性的挑战

重复事件的常见原因

  • 网络故障:像AWS API网关这样的API网关可能会在未及时收到响应时重试请求。 
  • 重试和确认延迟:支付网关可能会在确认延迟时重新发送“付款确认”事件。 
  • 故障的生产者或消费者:电子商务结账微服务可能会因系统中的错误而发出重复的“订单已创建”事件。 

没有幂等性可能的风险

  • 数据不一致:处理重复的“库存更新”事件可能导致库存水平不正确。 
  • 业务逻辑故障:为同一订单两次向客户收费会损害信任并造成退款头疼。 

电子商务流程图

以下图示说明了电子商务平台各个组件之间的操作和交互顺序。它强调了客户从浏览产品到完成购买和跟踪订单的旅程。该图通常包括核心流程,如用户交互、后台系统工作流、支付处理、库存更新和交付机制。该流程提供了一个整体视图,展示了各个组件如何相互作用以提供无缝的购物体验。此外,在关键工作流中实施幂等性,例如支付处理和库存更新,确保系统即使在网络故障或重试的情况下仍然可靠和一致。采用一些 AWS 服务,如 AWS SQS FIFO 队列DynamoDBSNS 可以显著简化事件驱动架构中幂等性的实现。

图中的关键流程

1. 用户浏览和搜索

  • 用户浏览产品目录或搜索特定商品。
  • 后台从产品目录服务中检索数据,通常使用 AWS ElastiCache 缓存以获得更快的结果。

2. 心愿单管理

  • 用户可以将商品添加到心愿单。
  • 操作是幂等的,以确保同一产品不会被多次添加。

3. 添加到购物车和结账

  • 产品被添加到购物车,确保幂等的数量调整以防止重复。
  • 在结账时,系统验证购物车内容并计算总价格。

4. 支付处理

  • 支付网关发起交易。
  • 幂等性确保即使因网关超时而发生重试,也只处理一次支付。

5. 下订单

  • 成功付款后,会触发“订单已下”事件。
  • 系统创建订单记录,幂等性防止重复订单的产生。

6. 库存更新

  • 根据下单情况调整库存。
  • 幂等更新确保即使在重复或重试事件中,库存水平也是准确的。

7. 订单履行与交付

  • 订单状态经历“处理中”、“已发货”和“已交付”等阶段。
  • 更新是幂等的,以避免因重复事件导致的错误状态变化。

8. 订单跟踪与通知

  • 用户可以查看他们的订单状态。
  • 通知(如电子邮件/SMS)以幂等方式发送,以避免向用户发送重复的垃圾邮件。

幂等性要求

1. 购物车更新

添加相同的产品两次应更新数量,而不是创建重复的购物车条目。

  • 实施:使用唯一的购物车项目标识符和在DynamoDB中的条件更新。

2. 支付网关

支付重试不得导致重复收费。

  • 实施:使用存储在IdempotencyKey中的DynamoDB来跟踪已完成的交易。

3. 订单下单

重试产生的重复“订单创建”事件不应创建多个订单。

  • 实施:在AWS DynamoDB中使用唯一的orderID和条件PutItem操作。

4. 库存更新

调整库存水平时应考虑重试,以避免过度减少。

  • 实施:使用分布式锁(例如,使用AWS DynamoDB TTL)来处理并发更新。

5. 通知

由事件触发的电子邮件或短信通知应仅发送一次。

  • 实施:使用去重键与亚马逊简单通知服务 (SNS)等服务。

结论

在事件驱动系统中,特别是在电子商务平台和像AWS这样的云架构中,幂等性对于保证可靠性、容错性和数据一致性至关重要。通过实施强大的幂等模式并利用如DynamoDB、SQS和SNS等工具,开发人员可以降低重试和重复事件带来的风险。本指南展示了采用这些做法不仅增强了系统的可靠性,还通过提供无缝和无错误的体验来建立用户信任。随着对弹性和可扩展系统的需求增长,掌握幂等性成为现代软件设计的基石。

Source:
https://dzone.com/articles/idempotency-and-reliability-in-event-driven-systems