背景
我们经常有一些业务需要发送优惠券给用户,优惠券发放有两种方式,一种是直接发送,一直是给用户领取,还有一些是需要支付的。
此处以发送短信给用户领取为例。
此场景类似于京东app发送话费优惠券短信给用户,用户点击链接跳转到网页或app领取。
方案设计
- 创建优惠券活动,配置金额和数量,及适用的用户
- 做一个活动页可以领取优惠券
- 利用mq延迟消息,发送20w用户信息到mq中(延迟的时间要比较分散,比如从1分钟到6小时内发送完)
- 短信服务订阅mq发送短信给用户,因为利用了mq延迟队列,所以用户领取的时候并发量会很小
- 领取优惠券时设置分布式锁或者乐观锁,防止优惠券超发。也可以利用update stock=stock-1 where stock-1>=0 and coupon_id=优惠券活动id实现
此处只讨论实现思路,所以没有具体的代码实现。
这也只是一种实现思路,未必是最好的,如果有更好的方案可以留言讨论交流。
扩展
优惠券生成方式
优惠券的发放有两张方式,一种是先生成所有优惠券,然后领取,还有一种领取的时候动态生成优惠券
这里建议使用第二种方式,领取的时候动态生成优惠券。
这种方式只有用户领取时才会生成优惠券,可以避免优惠券生成了但没有领取,造成垃圾数据增加存储成本降低查询效率。
如果嫌动态生成优惠券比较慢,也可以使用第一种和第二种结合的方式,比如20W优惠券先生成1000个,如果领取完或者领取后还剩100个(阈值可配置),再生成1000个,兼顾效率和性能,同时也能减少不必要的数据存储。
本文讨论了如何通过创建优惠券活动、利用MQ的延迟消息分批发送给用户,以及在领取时使用分布式锁或乐观锁防止超发。推荐动态生成优惠券以减少存储和提高效率,同时提供了结合两种方式的优化策略。
1370

被折叠的 条评论
为什么被折叠?



