分布式系统如何保证接口的幂等性

132 阅读1分钟

之前看了一些分布式相关的文章和视频,都记在笔记上了,现在准备重新整理一下,记录到博客里,后续可能会有补充

1.非分布式

        如果不是分布式的,可以在jvm内存里面加一个map或者set 支付的时候去看是否重复就可以了

2.分布式

如果是分布式的,比较重要的接口 扣款等,一定要保证幂等性

解决方案:每个请求必须有一个唯一的标识,支付请求,订单id

1.基于数据库的唯一键来实现

要求支付一个订单,必须插入一条支付流水,order_id是唯一的,在支付一个订单之前,先插入一条支付流水,order_id放入数据库中,重复支付的时候,尝试加入支付流水,数据库就会报错,整个事务回滚(流水号和订单号组合起来在系统中是唯一的)

2.redis实现

用一个标识 ,set order_id payed 下一次重复请求过来,就查一下order_id 对应的值,如果是payed就已经支付过了(支付的时候就生成一个key 然后设置有效时间,过了多长时间这笔订单就失效)

3.基于zookeeper来做

创建一个node,代表某个消息自己已经处理过了,如果有重复消息过来,创建node就会失败