从一个订单创建成功的12小时内,未成功发货,需要给客户退款。这个可以用什么设计实现
发布于 8 年前 作者 jiangliqin 5116 次浏览 来自 问答

订单存放在redis管理,我个人思考的方案有: 1.采用轮询的方式看那些订单接近12小时没有发货,就给客户退款; 2.用redis设置12小时的超时ttl,在过期销毁时触发退款; 3.用redis消息订阅/发布 机制

大家有其他思路吗?希望集思广益,帮我出下idea。谢谢大家

12 回复

2, 3中考虑有没有可能触发了退款,但退款失败,比如第三方退款API调用失败等原因。个人推荐第一种,跑一个定时service去做,失败了也可以记录下来供查阅。

@nullcc 恩,第1中比较可靠和可追踪

数据库读写分离的,可以使用第一种方式,如果没有,我建议用第二种方式,不过涉及到钱的,都需要有详细的日志记录,方便查询

一般用redis或者消息队列产品来做这个事情,如果想保持最终一致性,需要维护的事情很多。可以借助后台任务系统如Kue来实现,我们公司在用。

@sunkuo 听很多伙伴推荐Kue啊

@enternoder 恩,是读写分离的

如果对时间要求不苛刻, 大约12小时. 可以用一个 agenda 来做每(半)小时检查

个人觉得方案1,及1楼、7楼的靠谱,初期可以先用这个,留足余地,后期对时效性要求高的话再换其他机制,后期有集中处理的需求也说不定。

为什么要轮询?记个时间戳不行吗?用用户退款的时候的时间戳去减之前记录的时间戳,大于12小时就不给退,不就好了

9楼,你要不去轮询,你怎么知道那个时间戳相减已经有大于12小时的情况@zy445566

@zy445566 要的就是自动化, 不管用户点不点退款, 超过12小时, 状态自动更改为 “不可退款”

定时任务交给系统去做,linux的cron

回到顶部