幂等性的相关问题
1、什么是幂等性
用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生副作用。
2、为什么需要幂等性
简单业务场景: 当订单业务到了支付时、已经支付成后、由于网络或者服务器宕机等原因。导致未响应结果。 这时多次点击支付、若没有幂等性那么则会出现多次付款。 常见幂等性体现【Seata中TCC模式】。
3、幂等性的缺点
增加代码复杂度、并行改编成了串行,降低了执行效率。
4、如何保证幂等性
- 前端拦截
- 例如按钮的点击次数限制
- 使用数据库实现幂等性、
- 乐观锁
- 通过更新版本号实现
- 悲观锁
- 查询状态、添加操作、更改操作由于是非原子性的,那么可能得不到数据的一致性。应配合事务进行处理。
- 全局ID
- 雪花算法
- 唯一索引
- 乐观锁
- 使用JVM锁实现幂等性
- JVM锁实现是指通过JVM提供的内置锁,如Lock或者是Synchronuzed来实现幂等性
- 流程:通过Lock对代码段进行加锁操作、然后在判断此订单是否已经被处理过,如果未处理则开启事务执行订单处理、处理完成之后提交事务、释放锁。【适用于单机锁、分布式不适用】
- JVM锁实现是指通过JVM提供的内置锁,如Lock或者是Synchronuzed来实现幂等性
- 使用分布式锁实现幂等性
- 在每次执行方法之前、先判断是否可以获取到分布式锁,如果可以。则表示为第一次执行方法、否则直接放弃请求。