1.在分布式场景下,尤其是高并发和跨服务的重试机制,必须要考虑到接口的幂等性的问题。
幂等性是什么
什么是幂等性,幂等性,同一用户,多次调用同一个接口,返回的结果,必须相同。
Insert接口的幂等性解决方案
1.使用分布式锁保证幂等性。
比如在,在秒杀的场景下,一个用户只能购买同一个商品,一次的解决方案,采用用户id,存储到redis中。使用redis中的setNx操作,等待自然过期
2.使用token机制保证幂等性。
比如用户注册时,用户点击多次注册按钮。我们在用户给后台传入一个token,后台将这个token用作分布式锁。执行成功后不释放锁。等待自然过期。
3.使用mysql unique key保证幂等性。
比如用户注册是时候,用户虽然点击多次注册按钮。是不是会注册多个用户呢。我们可以将手机号作为唯一key,就是一个手机号只能注册一次。
update接口的幂等性。
1.比如用户购买商品的时候,减库存的时候,由于网络的问题,减库存可能调用多次。出现库存减了多次。
数据库乐观锁实现
UPDATE order SET COUNT=COUNT -1 version=version+1 where id=1 AND Version=1
DELETE 和SELECT 操作一般不会出现接口幂等性的问题。