消息队列问题:用户开通vip后,分发一个延迟执行判断到期的任务,如果用户在中间续费,如何处理任务堆积问题?

已解决

实现方式错了,改用定时任务了;

问题描述

项目里有一个用户开通VIP的功能,原先是用户每次访问时都要判断是否到期,后来改用了消息队列的方式,分发一个延迟任务,在用户到期日期的那一天提醒到期并设置权限。

然后发现了一个问题,如果在Vip到期前,用户续费了Vip,那又得再发一个延迟任务,在用户量较多的情况下,容易堆积大量无意义的延迟任务。我看了下文档貌似没有有关可以对队列进行更新或删除的方式。

相关环境

Laravel版本:9.2.0
Redis消息队列

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
巴啦啦
最佳答案

方式错了,会在错误的道路上越走越远,并且会为了这一个错误,打上很多错误的补丁。 最佳实践是定时任务每天跑一轮,检测最近三天即将过期的,检测到了再发通知。而不是成为vip后立即进行延时任务,没见过哪个延时任务要延一年的。希望对你有帮助。

1年前
讨论数量: 10
巴啦啦

方式错了,会在错误的道路上越走越远,并且会为了这一个错误,打上很多错误的补丁。 最佳实践是定时任务每天跑一轮,检测最近三天即将过期的,检测到了再发通知。而不是成为vip后立即进行延时任务,没见过哪个延时任务要延一年的。希望对你有帮助。

1年前

我总感觉定时任务比队列更适合这业务场景

1年前

为什么不记录一个到期时间,通过中间件查询是否到期呢?这里可以做一下缓存

1年前

目前改用其他方式了

1年前

队列里面加一个逻辑,在发之前判断是否续费了,没续费就发续费了,就跳过消费掉。
而且判断到期,应该使用定时任务来查,不应该已一开通就加入队列中。

1年前
巴啦啦

方式错了,会在错误的道路上越走越远,并且会为了这一个错误,打上很多错误的补丁。 最佳实践是定时任务每天跑一轮,检测最近三天即将过期的,检测到了再发通知。而不是成为vip后立即进行延时任务,没见过哪个延时任务要延一年的。希望对你有帮助。

1年前

定时检测过期散

1年前

定时任务吧,我也是定时任务实现的

1年前

这种vip 到期的都是自然日算的,用延时队列明显不适合这个场景,做个定时任务每天晚上12点扫描一次,到期的用户更新一下状态就行了。

1年前

如果用户数据量不是很大,定时任务是简单粗暴有效。如果用户量非常大延迟任务肯定是最佳实践,要根据业务灵活变化,这是我的理解哈

1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!