日常开发中,我们经常遇到这种业务场景,如:外卖订单超 30 分钟未支付,则自动取订单;用户注册成功 15 分钟后,发短信息通知用户等等。这就延时任务处理场景。在电商,支付等系统中,一设都是先创建订单(支付单),再给用户一定的时间进行支付,如果没有按时支付的话,就需要把之前的订单(支付单)取消掉。这种类
以的场景有很多,还有比如到期自动收货,超时自动退款,下单后自动发送短信等等都是类似的业务问题
MQ消息
摘要:RocketMQ 延迟消息 延迟消息,当消息写入到 Broker 后,不会立刻被消费者消费,需要等待指定的时长后才可被消费处理的消息,称为延时消息。在订单创建之后,我们就可以把订单作为一条消息投递到 rocketmq,并将延迟时间设置为 30 分钟, 这样30分钟后我们定义的 consumer 就可
阅读全文
posted @
2024-08-29 17:01
坐在云上飘
阅读(20)
推荐(0) 编辑
Redisson分布式延迟队列
摘要:Redisson 是一个基于 redis 实现的 Java 驻内存数据网格,它不仅提供了一系列的分布式的 Java 常用对象,还提供了许多分布式服务。 Redisson 除了提供我们常用的分布式锁外,还提供了一个分布式延迟队列 RDelayedQueue,他是一种基于 zset 结构实现的延迟队列,
阅读全文
posted @
2024-08-29 16:51
坐在云上飘
阅读(166)
推荐(0) 编辑
redis过期监听
摘要:redis 是一个高性能的 KV 数据库,除了用作缓存以外,其实还提供了过期监听的功能在 redis.conf 中,配置 notify-keyspace-events Ex 即可开启此功能。 然后在代码中继承 KeyspaceEventMessageListener,实现 onMessage 就可以
阅读全文
posted @
2024-08-29 16:27
坐在云上飘
阅读(131)
推荐(0) 编辑
JDK延迟队列 DelayQueue
摘要:DelayQueue是JDK提供的一个无界队列,我们可以看到,DelayQueue队列中的元素需要实现Delayed,它只提供了一个方法,就是获取过期时间。 用户的订单生成以后,设置过期时间比如30分钟,放入定义好的DelayQueue,然后创建一个线程,在线程中通过while(true)不断的从D
阅读全文
posted @
2024-08-29 16:17
坐在云上飘
阅读(56)
推荐(0) 编辑
定时任务
摘要:通过定时任务关闭订单,是一种成本很低,实现也很容易的方案。通过简单的几行代码,写一个定时任务,定期扫描数据库中的订单,如果时间过期,就将其状态更新为关闭即可 优点:实现容易,成本低,基本不依赖其他组件。 缺点:时间可能不够精确。由于定时任务扫描的间隔是固定的,所以可能造成一些订单已经过期了一段时间才
阅读全文
posted @
2024-08-29 16:12
坐在云上飘
阅读(17)
推荐(0) 编辑