吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 435|回复: 4
收起左侧

[求助] java redis任务队列问题请教

[复制链接]
ppgjx 发表于 2024-7-25 22:27
假设有三个变量
a,b,c

维护一个队列,每次修改这三个值都把需要修改的值丢进队列,队列的最后一个任务一定是最终需要修改的值, 以下是引起的问题

假设有三个任务队列是
1,2,3 - 2,3,4 -2,1,3

第一个任务值:  1,2,3  执行成功
第二个任务值:  2,3,4  暂时执行不成功(把这个任务追加到第三个任务后面)
第三个任务值:  2,1,3 执行成功

这就会导致一个问题他的值最终结果是 2,3,4,而不是2,1,3,这个问题如何解决?任务2暂时执行失败,不能影响任务3的执行,不能一直去重试任务2





发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

melo520 发表于 2024-7-26 08:55
重试机制:可以设置一个定时器或监控线程,定期检查“执行失败”的任务。
条件重试:只有当任务不影响后续任务结果时,才重试。例如,如果任务2失败了,但任务3已经修改了变量,则任务2不应重试。
确保最终一致性:确认最终状态:确保队列中最后一个“执行成功”的任务的内容是变量的最终状态。一旦确认最终状态,可以清理掉所有“执行失败”的任务,或禁执行不再更新。
skymilong 发表于 2024-7-26 09:58
逻辑不对吧。 你要保证严格有序,就必要加锁。走串行化应该是好的。 走最终一致可能要重算
Ashtareve 发表于 2024-7-29 21:24
首先不清楚你的 a,b,c 存储在哪里,内存中?redis中?
不清楚你的队列是什么?中间件?内存中?redis zset?
也不清楚你具体执行步骤,所以以下来自假设的情况:

假设队列使用中间件 kakfa,abc为一个 redis 的 string key,(2,1,3)为 value。
执行步骤为 (1)代码从中间件接收到消息,(2)执行更新 redis操作,(3)如果出错/超时则将消息重新发送给中间件到队列最后。
这种情况下,
从(1)处理,则需要在消息中增加 timestamp 字段,标志消息产生时间,同时在接受消息的时候判断这个timestamp是否是最新的,不是最新的消息直接抛弃即可。
从(3)处理,如果出错/超时,不再发送消息,即刻断开对消息topic的订阅,直到报错/超时消息处理成功,再重新订阅消息。
workzj 发表于 2024-8-6 11:58
最简单的思路,开三个线程,每个线程对应一个队列
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-9-8 09:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表