背景:
在开发产品,交付给用户使用之后,重复提交的现象偶尔或经常出现。开发人员觉得数据重复,用户觉得订单多了一个,产品觉得有bug。这可不是好现象。
下面以创建订单为例:
原因:
1、误操作两次点击下单按钮;
2、超时导致重复点击;
3、产生订单后没有成功提醒或者客户端出错导致用户没有收到成功消息,重新下单。
后果:
当然是产生了重复订单,体验不好,影响不好。^_^
解决方案:
-
最通用的方法:幂等处理。
简单来讲,在用户开始进入订单流程时,就在客户端产生一个dupKey,做为跟踪。
数据库里订单表加一个dupKey字段,做一个唯一约束。
在客户端点击创建订单时,后台的接口应该在创建订单之前检测表里的dupKey。
如果不存在,就表明是新单子,新增一条记录,并返回该记录。否则把dupKey对应的订单返回到前端。同时返回记录里需要加上是否是重复下单的字段isDupRequest=true。所以后端接口可以命名为:createOrGet()
这种方案简单有效。 -
如果客户下单流程走一半,因其它原因重头开始,又走了一遍流程。这样的体验就不大好了。
我们可以把客户下单的重要信息缓存起来。在醒目的位置提醒一下用户还有一个未完成的订单,通过短信通知或者其它APN通知渠道都可以。这样客户点击这个提醒之后,会进入未完成的流程,会节省很多操作。应该也会促进订单的成功率。 -
人工方式
这种方式就比较简单粗暴了。开发的后台管理可以操作订单,删改订单、退款等。但是线上运行的时候,牵涉的人比较多。客户上报问题=>运管人员核查问题=>开发人员排查问题=>运营人员解决问题。