解决高并发、保证数据一致性、幂等性的方案

基本思路:在每次请求服务之前,先必须调用"令牌服务",获得一个唯一的令牌,然后再带上令牌ID这个参数去调用相关的服务。由于这个令牌ID是唯一的,所以,这样可以有效的防止同一个业务多次执行。

具体步骤如下:

step1.首先在数据库中创建一个存放令牌相关信息的表open_ticket;

step2.定义调用令牌服务的参数:至少包括 操作用户、业务编号、业务场景类型;

step3.定义获取"令牌"的服务TicketDTO builderTicket(TicketCreateParam ticketCreateParam)

    a.检查创建参数的完整性;

    b.检查当前唯一业务编号令牌是否已经创建;

    c.TicketDTO newTicket = builder(ticketCreateParam);

step4.调用相关业务服务执行成功后更新令牌信息的状态为成功。


说明:一般在电商项目中,这种高并发是很常见的,为了防止同一个业务被多次执行,比如一个订单可能被多次支付,重复扣钱,我们就可以通过这个方案有效的避免,比如当同一个订单第二次进行支付时,由于订单号和上一次相同,业务类型也是订单支付,所以在调用"令牌服务"时,会被检查到此业务已经创建过令牌ID,且状态还是受理中,这时,创建令牌服务信息就会失败,直接返回,后面的支付操作就不会被执行到了