Ruby SolidQueue 支持防抖式的 Job 么?

qichunren · 2025年10月14日 · 最后由 qichunren 回复于 2025年10月15日 · 149 次阅读

我的需求场景是这样的,在后台用户可以添加/编辑某个 Post 记录,在 after_commit 后,需要执行一个比较耗时的基于当前表的所有记录的异步缓存任务 PopulateGlobalPostsCacheJob。如果用户在一条条操作记录,这样会依次创建多任务在执行,而实际上只有最后一个任务是有效的。

我想到的办法就是在模型的 after_commit 中,插入一个在 2 分钟后执行的异步任务。如果这时发现有等待中的任务,就取消之前的这个任务。

要是 SolidQueue 能支持这个用法就好了。

没用过,但是扫了一眼文档

https://github.com/rails/solid_queue?tab=readme-ov-file#concurrency-controls

这里的 on_conflict 似乎能支持这个用法

coderliu 回复

on_conflict 支持的:discard 参数是将后面的入队的 Job 忽略掉,不是这个使用场景。

on_conflict 支持的:discard 是用在这样的场景:例如 在进行全站数据库备份等比较耗时的操作时,保证只有一个任务在进行,任务正在执行时,后续同样的任务入队了就忽略掉。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号