延时消息队列

https://blog.csdn.net/qq_20009015/article/details/89981008 这个场景
场景,有两个接口分别会接收两个数据,如果其中一个数据校验失败,那么另一个数据也要删掉。

由于是两个独立的数据源,没法做事务的回滚。( 这两个数据源是来自canal的监听得到的)。

因此考虑的方案就是,当校验不通过的时候,通过异步的方式,去起一个线程去删掉另一个接口过来的任务,但是这两个数据过来会有延时几秒,因此在另一个线程里面,先休眠3秒在执行删除。

这个方案存在问题:
1.线程即使在休眠,也是占用着线程资源,不合理
解决方案:使用延时队列,DelayQueue
任务先放到延时队列里面,设置好延时时间,然后消费者从延时队列里面取出来再放到线程池里面。

更好的方法,使用生产者消费者模式,需要需要延时执行的任务都放进去,然后消费者那边 根据任务类型调不同的消费者方法去执行。(这块也可以做成handler模式或者策略模式)

缺点:如果中途系统重启,那么保存在队列里面的任务就都丢失了。
解决方案:加一个数据库或者redis,把队列里面的数据存进去,重启的时候去读回来。

2.使用mq的延时消息队列。 在发送消息的时候设置延时时间,那么消息会先保存在消息中间件里,等时间到了再投递,这样消费者就可以消费到消息,然后触发后续动作。
在这里插入图片描述
比如说用户下单之后,15分钟未付款则要关闭订单。

你可能感兴趣的:(java,学习)