怎样实现订单 30 分钟未支付自动取消?
先自己想一想,再看参考要点
参考要点
- 下单时发一条 30 分钟后投递的延迟消息,到期后消费者用条件更新取消订单(WHERE status = 'UNPAID'),重复或晚到的消息不会取消已支付的订单,要求高的业务再用低频扫描兜底
- 用户已付款、回调还没到时本地仍是待支付,所以取消前要先向支付平台关单,平台返回已支付就按支付成功处理
- RocketMQ 4.x 有 30m 延迟级别,5.x 可指定任意时间,RabbitMQ 用 TTL 加死信队列
- 也可以用 Redis 有序集合,分值为到期时间,后台线程取到期成员,多实例用 ZREM 返回 1 决定由谁处理