给20w用户发优惠活动的短信,让用户领取优惠券,问怎么设计

本文讨论了如何通过创建优惠券活动、利用MQ的延迟消息分批发送给用户,以及在领取时使用分布式锁或乐观锁防止超发。推荐动态生成优惠券以减少存储和提高效率,同时提供了结合两种方式的优化策略。

背景

我们经常有一些业务需要发送优惠券给用户,优惠券发放有两种方式,一种是直接发送,一直是给用户领取,还有一些是需要支付的。

此处以发送短信给用户领取为例。

此场景类似于京东app发送话费优惠券短信给用户,用户点击链接跳转到网页或app领取。

方案设计

  1. 创建优惠券活动,配置金额和数量,及适用的用户
  2. 做一个活动页可以领取优惠券
  3. 利用mq延迟消息,发送20w用户信息到mq中(延迟的时间要比较分散,比如从1分钟到6小时内发送完)
  4. 短信服务订阅mq发送短信给用户,因为利用了mq延迟队列,所以用户领取的时候并发量会很小
  5. 领取优惠券时设置分布式锁或者乐观锁,防止优惠券超发。也可以利用update stock=stock-1 where stock-1>=0 and coupon_id=优惠券活动id实现

此处只讨论实现思路,所以没有具体的代码实现。

这也只是一种实现思路,未必是最好的,如果有更好的方案可以留言讨论交流。

扩展

优惠券生成方式

优惠券的发放有两张方式,一种是先生成所有优惠券,然后领取,还有一种领取的时候动态生成优惠券

这里建议使用第二种方式,领取的时候动态生成优惠券。

这种方式只有用户领取时才会生成优惠券,可以避免优惠券生成了但没有领取,造成垃圾数据增加存储成本降低查询效率。

如果嫌动态生成优惠券比较慢,也可以使用第一种和第二种结合的方式,比如20W优惠券先生成1000个,如果领取完或者领取后还剩100个(阈值可配置),再生成1000个,兼顾效率和性能,同时也能减少不必要的数据存储。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值