论幂等性

82 阅读2分钟

1. 幂等概述

幂等(Idempotence)是指任意一个操作的多次执行总是能获得相同的结果,不会对系统状态产生额外影响 幂等设计主要是为了处理重复请求而生的,好的幂等方案可以保证重复请求获得预期结果,而不产生副作用。 在实际开发中,以下场景会产生重复请求:

  • 用户不可靠:用户通过客户端发起请求,由于手抖或有意重复点击,很容易造成导致极短时间内发起多次重复请求。

  • 网络不可靠:网络抖动、网关内部抖动有可能触发重试机制,这个在使用消息队列投递消息时经常会遇到。

  • 服务不可靠:在需要保证数据一致性的场景中,如果调用下游服务超时,在无法确认执行结果的情况下,常用的处理方法是重试。

幂等设计是为了识别并处理重复请求,而并发仅仅是重复请求的一种特殊情况。 事实上,只要重复请求涉及写操作,无论是否并发,都需要做好幂等处理。举个例子,用户在pc端同时开了两个窗口,间隔10分钟分别提交表单,所有参数完全相同,这显然不属于并发,但仍需要进行幂等处理。

幂等号通常有两种设计方式:

  1. 非业务幂等号:通过唯一标识符(如UUID、时间戳或业务流水号)在调用方和被调用方之间明确实现幂等性。由于非业务幂等号难以通过业务上下文追溯,因此调用双方都必须将其持久化,从而保证请求与幂等号的关系有迹可循。

    例如,在DailyMart案例中,订单服务在调用库存服务时会传递订单流水号作为幂等号,以便在多次请求时识别重复操作。

  2. 业务幂等号:由业务元素组合构成的幂等号,如“用户ID+活动ID”。使用此方法时,调用方无需单独持久化幂等号,被调用方可以根据请求参数和业务上下文直接获取并组合这些参数。例如,通过设置“用户ID”和“活动ID”的联合唯一索引来实现幂等性。