电商平台,用户下单,但是未付款.需要在半个小时之后取消该订单.如何处理比较好?
Order 表, status 字段 wait_pay
DB 轮询
每隔一段时间去数据库查询 Order 表status 为 wait_pay 的订单,将过期的status 标记为 cancel
优点:简单方便,易于实现
缺点:对数据库性能有影响
DelayedQueue
优点:简单,高效
缺点:灾难恢复
Redis ZSet
优点:灾难恢复,分布式
缺点:开发复杂,依赖第三方组件
综合下来,好像就只有DB最简单。
思考:既然DB轮询的策略简单可行,那么把缺点弱化不就是比较好的方案了么?
改进:
- DB 主从,轮询从节点 DB.
- 轮询的时间取业务允许范围的最大值,比如10s,只查找最近31分钟的记录.
- 既然数据库成为分布式系统的瓶颈,为何不选择分布式数据库来从根本上解决问题?
希望大牛不吝赐教
To young too simple还有更合适的解决方案:
使用消息队列,死信队列