公牛队列:通过在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中使用部分时间戳确保时间段内的唯一作业的主要内容,如果未能解决你的问题,请参考以下文章

如何中止公牛队列中的特定任务?

用于队列和 api 的嵌套公牛单独进程

节点公牛队列错误:缺少作业类型 JOB_NAME 的进程处理程序

Kafka - 使用高级消费者的延迟队列实现

日志4J;如何使用 ConversionPattern 确保时间戳始终在 GMT 中?

打字机。通过日期查询时仅使用日期部分并排除时间戳部分