如何保证接口幂等性?

最近面试被问到的关于如何保证接口的幂等性问题:

首先,幂等需要唯一的业务单号来保证。以支付业务为例,在不考虑并发的情况下,实现幂等只需要两步:

1.判断订单是否已经支付过了,

2.如果已经支付成功则返回成功。待支付则进行支付流程,然后修改支付状态。

高并发下可能会出现问题,则需要将查询和更改操作加锁。

1.乐观锁

用version来实现乐观锁

UPDATE tab1 SET col1=1,version=version+1 WHERE version=#version#

2.防重表

其实这个方法也就是根据数据库的唯一索引不可重复,每个订单操作都插入一条数据,后面的请求无法操作,更新结束后才会删除防重表的数据。

3.分布式锁

防重表其实也可以用分布式锁来替代。redis或zookeeper实现

4.token令牌

这种方式分成两个阶段:申请token阶段和支付阶段。 第一阶段,在进入到提交订单页面之前,需要订单系统根据用户信息向支付系统发起一次申请token的请求,支付系统将token保存到Redis缓存中,为第二阶段支付使用。 第二阶段,订单系统拿着申请到的token发起支付请求,支付系统会检查Redis中是否存在该token,如果存在,表示第一次发起支付请求,删除缓存中token后开始支付逻辑处理;如果缓存中不存在,表示非法请求。

 

你可能感兴趣的:(2019年java面试)