微服务接口幂等性设计

一,什么是幂等性

所谓幂等性,就是对接口的多次调用所产生的结果和调用一次结果是一致的。即不用担心重复执行。


二,业务场景

用户在线下单,下单后系统需要生成对应的工单,用户通过在线工单跟进后续服务状态。
在这个过程中可能会出现了几个问题:

1,用户在前端重复提交,造成同样的订单创建多笔。

2,订单服务调用工单服务由于网络原因或者其他原因失败,发起重试,可造成工单服务创建多笔。

三,技术架构


上图可以看到订单服务和工单服务都是集群部署,分别部署了两个实例。前端调用后端利用nignx作为负载,同时nignx也有重试机制。
订单服务和工单服务都是采用Spring Cloud架构做的微服务,并利用Ribbon做了重试机制配置。


四,用户重复提交问题

这个问题等同于表单重复提交,一般的解决思路是token机制。

也就是说在表单提交之前需要向后端申请token,后端返给前端token的同时需要把token保存到redis中,并设置超时时间。

请求接口时,将此token放在header中或者作为参数,后端判断token是否存在,存在则删除token并正常处理业务逻辑;否则返回重复提交提示。


这个方案也可以解决nginx重试机制。


五,重试机制问题

如上场景问题2,重试会造成工单生成多笔,所以可以利用数据库的唯一索引,这个就不在展开说了,设置唯一索引就ok。

六,技术架构改造

在后续为了服务的解耦,一般会引入MQ,而MQ一般会有补偿机制,也就是重试或者人工重试,这个时候建议使用业务主键来做幂等性,也就是上面说的方案2,如果你用消息默认的唯一ID是做不到的,因为每次重试ID都会跟着变。


七,总结

在做微服务架构设计时,需要考虑接口幂等性,在架构初期可以考虑简单方案解决,比如利用数据库唯一索引。随着业务增长和技术提升在考虑复杂方案。

 

如果你喜欢,欢迎关注我的公众号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值