Kafka实现订单超时取消的两种模拟策略

在业务场景中有一个需要定时15分钟后取消用户订单的功能,可以使用Java的任务调度框架来实现,但还需要引入框架依赖和设置数据表等,对业务的侵入性很大,有点大材小用的感觉,所以这里使用延时队列就可以,Kafka本身是不支持延时队列的,需要在生产消息和消费时进行一些二次开发,以下是我对该业务具体实现的思考。

1.建立不同时间区间的topic

Kafka内部有很多延时性的操作,如延时生产,延时拉取,延时数据删除等,这些延时功能由内部的延时操作管理器来做专门的处理,其底层是采用时间轮实现的,我们可以参照时间轮的设计,设置多个时间区间的topic,如60min,50min,40min,30min,20min,10min的topic,生产者在生产数据时,将要过期时间作为key存入消息中,而消费端需要自己实现一个类似于拦截器的功能,判断条件为:当前时间 - 过期时间 是否小于该时间区间的topic,大于的话则不进行处理,小于的话则进行位移提交,将该消息发送到下一级的topic中,依次往复遍历,到达最后一个topic时为预设好的过期时间,对数据库里的订单进行更新。

2.惰性数据加载变更

基于第一种方法会存在一定的时间差,不会在刚过期就立刻失效,所以使用第二种方法作为方法一的补充,即在用户查询该订单的时候,判断订单状态是否超时,如果发现已经超时但状态没有更新,先更新订单状态再返回给用户。
以上两种策略的实现是针对订单这类实时性要求并不高的场景,因为用户不会一直盯着订单等到超时,更多情况是创建订单后未支付便关闭了,再过一段时间打开,基于此场景可以使用这两种取巧的方法来处理。