java redis任务队列问题请教
假设有三个变量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
重试机制:可以设置一个定时器或监控线程,定期检查“执行失败”的任务。
条件重试:只有当任务不影响后续任务结果时,才重试。例如,如果任务2失败了,但任务3已经修改了变量,则任务2不应重试。
确保最终一致性:确认最终状态:确保队列中最后一个“执行成功”的任务的内容是变量的最终状态。一旦确认最终状态,可以清理掉所有“执行失败”的任务,或禁执行不再更新。 逻辑不对吧。 你要保证严格有序,就必要加锁。走串行化应该是好的。 走最终一致可能要重算 首先不清楚你的 a,b,c 存储在哪里,内存中?redis中?
不清楚你的队列是什么?中间件?内存中?redis zset?
也不清楚你具体执行步骤,所以以下来自假设的情况:
假设队列使用中间件 kakfa,abc为一个 redis 的 string key,(2,1,3)为 value。
执行步骤为 (1)代码从中间件接收到消息,(2)执行更新 redis操作,(3)如果出错/超时则将消息重新发送给中间件到队列最后。
这种情况下,
从(1)处理,则需要在消息中增加 timestamp 字段,标志消息产生时间,同时在接受消息的时候判断这个timestamp是否是最新的,不是最新的消息直接抛弃即可。
从(3)处理,如果出错/超时,不再发送消息,即刻断开对消息topic的订阅,直到报错/超时消息处理成功,再重新订阅消息。
最简单的思路,开三个线程,每个线程对应一个队列
页:
[1]