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

已解决

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

问题描述

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

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

相关环境

Laravel版本:9.2.0
Redis消息队列

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
巴啦啦
最佳答案

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

2周前
讨论数量: 10
巴啦啦

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

2周前

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

2周前

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

2周前

目前改用其他方式了

2周前

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

2周前
巴啦啦

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

2周前

定时检测过期散

2周前

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

2周前

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

2周前

这种的直接现在数据表存放到期时间,续费修改到期时间,每天定时任务监测,发送通知,权限根据到期时间与当前时间做对比

2周前

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

2周前

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