幂等设计-1

184 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

一,业务场景:
业务场景一:用户重复下单
业务场景二:用户重复支付
业务场景三:用户转帐重试

二,什么是幂等:
幂等的定义:
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在数学中,幂等用函数表达式就是:f(x) = f(f(x))。比如求绝对值的函数,就是幂等的,abs(x) = abs(abs(x))。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。
这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现。

三,幂等场景
1,天然幂等场景:
查询类的读操作,天然是幂等的,多次调用不会有副作用。

2,需要保证幂等的场景
调用下游写接口
写数据库、写Redis等
消息订阅和处理

3,如何保证幂等:
大部分幂等涉及到写请求
写请求一般是CRUD
CREATE/INSERT
insert user values (uid,name,age,sex,time)
(业务主键,唯一索引,留意自增索引的优势劣势)
READ/SELECT
select * from user where uid=3
(天然幂等)
UPDATE
update user set age = 18 where uid=3(执行多次是幂等,绝对值修改)
update user set age++ where uid = 3 (相对值的修改)
DELETE
delete from user where uid=3 (一般不会删除,会做伪删除。)
delete from user where uid in top 10 (多次执行,变化删除)

4,幂等案例(update)
案例一:消息是否已读。
天然幂等
案例二:年龄增加1岁
增加where条件
where age=18
相对修改转换成绝对修改
set age = 19
案例三 电商平台购买商品
商品 价格1万
确认收货
订单状态 (打款,状态修改)

处理流程:
1,状态判断
2,打款动作
3,状态修改
分布式事务

四,常见的问题
冗余部署多个服务。
存在并发处理的可能性
解决:把并发转串行消息,使用分布式锁