公牛队列:通过在jobId中使用部分时间戳确保时间段内的唯一作业
Posted
技术标签:
【中文标题】公牛队列:通过在jobId中使用部分时间戳确保时间段内的唯一作业【英文标题】:Bull queue: Ensure unique job within time period by using partial timestamp in jobId 【发布时间】:2018-10-30 23:35:37 【问题描述】:我需要确保添加到队列中的相同作业在一定时间内不会重复。
是否值得在我唯一的jobId
字符串中包含部分时间戳(即D/M/Y-HH:M
),以便仅在不在同一分钟内处理?
如果在12:01
添加一个工作,在12:09
添加另一个工作,它仍然会重复——或者Bull 有更好的方法吗?
【问题讨论】:
现在我使用的是纪元 unix 时间,在添加到 jobId 之前删除最后 4 个整数,效果很好。不确定它是否会在生产中遇到问题。 更新:从那以后我们一直在生产中运行它,到目前为止它没有引起任何问题 【参考方案1】:Bull 旨在通过忽略使用现有作业 ID 添加的作业来支持幂等性。请注意不要启用 removeOnCompleted
等选项,因为该作业将在完成后被删除,并且不会在您下次添加作业时被考虑。
在您的情况下,如果您想确保在给定时间跨度内没有添加新作业,只需确保该时间戳期间的所有作业 ID 都相同,例如您在评论中删除 4 UNIX 时间戳的最后一位。
【讨论】:
【参考方案2】:我觉得你应该使用 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
Job 项应提供足够的数据,以便您找到您正在寻找的那个。
【讨论】:
以上是关于公牛队列:通过在jobId中使用部分时间戳确保时间段内的唯一作业的主要内容,如果未能解决你的问题,请参考以下文章
节点公牛队列错误:缺少作业类型 JOB_NAME 的进程处理程序