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

已解决

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

问题描述

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

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

相关环境

Laravel版本:9.2.0
Redis消息队列

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
巴啦啦
最佳答案

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

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

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

1年前

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

1年前

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

1年前

目前改用其他方式了

1年前

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

1年前
巴啦啦

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

1年前

定时检测过期散

1年前

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

1年前

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

1年前

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

1年前

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