系统服务幂等性设计介绍

本文介绍了系统设计中的幂等性概念,源于数学中的幂等函数,确保服务多次调用对资源的影响一致。文章列举了分布式架构中幂等性的场景,如重试、用户多次点击和异步回调,并探讨了HTTP方法与数据库操作的幂等性关系。解决幂等性问题的方法包括前端控制、过滤重复动作和处理重复写入,如分布式锁、Token令牌、唯一约束等。幂等性虽增加复杂性,但在保证数据准确性方面至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在日常系统设计过程中或者在架构设计评审会上,经常会听到这个服务需要注意幂等性,但到底什么是幂等性,估计同学们可能都一知半解,那今天就来说一说幂等性究竟是什么,以及其作用是什么,怎么解决幂等性问题。

 

幂等,来源于数学中的一个概念,指用相同的参数重复执行函数,永远能获得相同结果的函数,即f(f(x)) = f(x)这个等式永远成立,映射到系统设计上则多次调用对系统的产生的影响或变化都是一样的。

幂等性强调的是外界通过接口对系统内部的影响, 一次或多次调用对某一个资源应该具有同样的副作用就行。

 

==========================================================

幂等性的场景有哪些?

1)分布式架构中,若出现服务调用超时的现象,可能会进行重试;

2)用户交互过程中多次点击,触发多次调用;

3)异步回调模式中,因异常情况会导致多次回调;

 

幂等性的作用是什么?

保证多次调用对资源的影响是一致的,我们利用资源处理应用来说明一下

HTTP方法与数据库操作的映射关系:

HTTP方法

数据库操作

PUT

CREATE

GET

READ

POST

UPDATE

DELETE

DELETE

通常只需要对写请求作幂等性处理

查询

SELECT * FROM users WHERE user_id;

不会对数据产生任何变化,天然具备幂等性。

新增

INSERT INTO users (user_id, name) VALUES (1, 'xxx');

case1:user_id若全局唯一,重复插入会失败,具有幂等性;

case2:user_id若非全局唯一,重复插入会成功,不具有幂等性;

修改

UPDATE users SET score = 30 WHERE user_id = 1;

case1:直接赋值,不管执行多少次score都一样,具备幂等性。

UPDATE users SET score = score + 30 WHERE user_id = 1;

case2:计算赋值,每次操作score数据都不一样,不具备幂等性。

删除

DELETE FROM users WHERE id = 1;

case1:绝对值删除,重复多次结果一样,具备幂等性。

DELETE top(3) FROM users;

case2:相对值删除,重复多次结果不一致,不具备幂等性。

 

幂等性问题如何来解决?

1)控制重复请求

控制动作触发源头,即前端做幂等性控制,仅算作辅助解决方案。

例如:

  • 提交按钮仅可操作一次(提交动作后按钮置灰)

2)过滤重复动作

控制过滤重复动作,是指在动作流转过程中控制有效请求数量。

例如:

  • 分布式锁,通过Redis控制同一时间只能完成一次请求;
  • Token令牌,一个令牌只能允许放行一次请求
  • 缓冲队列,将所有请求放入队列进行过滤处理;

3)解决重复写入

控制数据写入能力,即通过一些约束方式控制重复数据的写入。

例如:

  • 悲观锁,即对数据库的行或表上锁,使其他并发执行发生排斥,达到锁的效果;
  • 乐观锁,每次更新的时候带上version版本,如果version变化了,则更新失败;
  • 唯一约束,利用了数据库的主键唯一约束的特性,来控制不会产生重复数据;

==========================================================

总结:幂等性处理虽然复杂了业务处理,也可能会降低服务的处理效率,但是有些业务场景为了保证系统数据的准确性,还是非常有必要的;

注:文章均原创,部分图片及文字来源于网络,若涉及版权,请联系作者,将第一时间备注出处,谢谢。

设计分布式系统接口的幂等性时,可以采取以下策略: 1. 使用唯一标识符:为每个请求生成唯一的标识符(例如UUID),将该标识符作为请求的一部分,在服务端进行幂等性校验时使用。服务端可以通过记录已处理请求的标识符,避免对同一请求的重复处理。 2. 幂等性检测:在服务端对接口请求进行处理之前,检测该请求是否已经被处理过。可以通过查询数据库、缓存或日志等方式来判断该请求是否已经被处理。如果已经被处理过,则直接返回之前的结果,避免重复处理。 3. 乐观锁机制:在处理接口请求时,使用乐观锁来保证操作的原子性和幂等性。通过在数据记录中添加版本号或时间戳等字段,当多个请求并发操作同一数据时,只有一个请求能够成功执行,其他请求会失败并返回适当的结果。 4. 幂等性响应标识:在接口响应中返回一个唯一的标识符,该标识符可以用于客户端判断该请求是否已经被成功处理过。客户端可以保存该标识符,并在后续的请求中将该标识符传递给服务端,以确保幂等性。 5. 事务处理:在进行涉及状态更新的操作时,使用事务来保证操作的原子性和幂等性。如果操作失败,事务会回滚到之前的状态,避免对同一请求的重复处理。 以上是一些常见的设计策略,可以根据具体系统的需求和特点选择适合的幂等性设计方式。同时,还需要注意在接口文档中明确指定接口的幂等性要求,以便开发人员正确使用和处理接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值