公牛队列:通过在jobId中使用部分时间戳,确保在一段时间内完成独特的工作

时间:2018-05-21 10:18:57

标签: node.js message-queue priority-queue job-queue bull.js

我需要确保添加到队列中的相同作业在一段时间内不会重复。

是否值得在我的唯一D/M/Y-HH:M字符串中包含部分时间戳(即jobId),因此仅当不在同一分钟内时才会处理?

如果在12:01添加了一个作业而在12:09添加了另一个作业,它仍然会重复 - 或者Bull有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

Bull旨在通过忽略添加有现有作业ID的作业来支持幂等。请注意不要启用诸如removeOnCompleted之类的选项,因为该作业将在完成后被删除,并且在下次添加作业时不会被考虑。

在您的情况下,要确保在给定时间段内未添加任何新作业,只需确保该时间戳记内的所有作业ID都相同,例如您在注释中写的删除了4个UNIX时间戳的最后一位。

答案 1 :(得分:0)

我觉得您应该使用Bull的API检查作业是否正在运行,然后决定是否将作业添加到队列中(在生产者上进行修补)。

您还可以决定在运行作业时(在流程功能内部)检查是否已经在运行类似的作业,并尽早返回而不是执行该作业(对使用者进行修补)。

您可以使用Queue getJobs函数执行此操作:

getJobs(types: string[], start?: number, end?: number, asc?: boolean):Promise<Job[]>

"Returns a promise that will return an array of job instances of the given types. Optional parameters for range and ordering are provided."

从文档中: https://github.com/OptimalBits/bull/blob/develop/REFERENCE.md#queuegetjobs

“作业”项应提供足够的数据,以便您可以找到所需的数据。