问题的原因
在我们分布式系统中,可能会因为网络波动等无法避免的原因,导致请求多次,例如支付系统多次点击,如何保证只会支付一次,避免用户多次支付,这就是我们所说的业务的幂等性。
一、全局唯一id
还是拿支付系统来举例,下达支付请求后,我们会接收到Oderid(订单ID),这个订单ID肯定是不可重复的,在进行业务逻辑操作时,首先根据这个订单ID看是否处理过这个请求,如果处理过就返回重复请求之类的提示,如果没处理过就接着执行我们的业务逻辑
二、去重表
依然用支付系统来举例,在每次支付请求成功后,会产生一个流水表的记录,流水表里会有一个订单表id 的字段进行关联,我们收到orderid后首先根据这个订单id去查询流水表是否有记录,如果有就说明已经支付过了,同上如果没有就继续执行我们的业务逻辑。
三、状态机
我们收到支付请求后,查询订单的状态是否为代付款状态,如果不是待付款状态则说明请求重复,如果为代付款状态则说明没有支付过,继续我们的业务逻辑。
还有其他的解决方案,条条大道通罗马,针对于不同的业务场景可以选用不同的解决方案