分布式服务的幂等性的个人见解

概念

幂等的概念来自于抽象代数,比如对于一元函数来说,满足如下条件:
f(f(x)) = f(x)即可称为满足幂等性。在计算机科学中,一个操作多次执行和一次执行的影响相同,这样的操作即符合幂等性。在分布式的系统中,服务消费方调用服务提供方的接口,多次调用的结果应该与一次调用的结果相同,这就是分布式环境下的幂等性的语义。为什么都在强调幂等性?因为分布式服务系统有可能因为网络不稳定原因导致一个服务的接口被重复调用,避免产生未知的异常。

考虑如下场景是否要保证幂等性:
a.运营发起打款操作,由于网络原因或者重试机制,重复打款了;
b.提交表单,由于浏览器卡顿,用户多次点击提交按钮导致重复提交;
经过分析可知上面两种场景必须保证幂等性,不然会造成系统的数据异常。我们再从数据库的操作层面分析上面的两种场景,都是写操作,于是我们可以分析得出数据库的CRUD有如下特点:
新增:不具备幂等性
查询:天然具备幂等性,因为查询不会影响数据库里的任何结果
修改:不具备幂等性
删除:具备幂等性

那如何解决幂等性呢?

1,全局唯一ID
根据业务生成全局唯一的ID,调接口的时候传入该ID,服务方会从存储系统查询是否存在这个ID,如果不存在则可调用接口,否则拒绝本次请求。
2,利用数据库的去重
如在mysql中设置关键属性为UNIQUE,当业务中重复插入的时候,抛出唯一约束异常,操作就会回滚。
3,状态机控制
适合在有状态机流转的情况下,比如订单的创建和付款,订单的创建肯定在支付之前,这样可以添加一个int类型的字段表示订单的各个状态,创建为0,付款成功为100,失败为99,则更新订单的语句可以如下表示:
update order set status=#{status} where id=#{id} and status<#{status}
4,插入或者更新
在mysql中有个功能是存在则更新,不存在则插入,即在insert into语句后跟上on duplicate key update,mysql会判断插入语句的主键值和数据库现有的记录是否重复,如果重复,则会修改原有的记录,不重复则添加一条数据。

你可能感兴趣的:(分布式服务的幂等性的个人见解)