单个jvm里面
搞一个map或者set,记录好这个订单的状态被支付过就行。
分布式
保证幂等性:
1、对于每个请求必须有唯一的标识,如订单id,每个订单id最多只能被支付一次。
2、每次请求处理完之后,必须有一个记录标识这个请求被处理过了。比如用db来记录状态,支付之前记录这个订单的支付流水并且支付流水采用订单id做唯一key,只有成功的插入这个支付流水才能执行实际的支付扣款。
3、每次接收请求需要进行判断之前是否处理过的逻辑处理,比如一条订单已经支付了,就已经有了一条支付流水,如果重复发送这个请求,则此时先插入支付流水,因为唯一key的约束,会报错插入不进去,就不会扣款的。
这3点是保证幂等性的主思路,方案不唯一,比如还可以用redis来保存一个是否处理过的标识也可以,服务的不同实例一起去操作redis。