如何将消息标记为 "in progress" 以便其他工作人员不处理它
How to mark a message as "in progress" so other workers don't work on it
我正在尝试使用拉入队列创建一个图像处理任务队列,该队列可能需要超过 10 分钟的 acktimeout 限制。我正在使用 node.js api 我想知道如何让工作人员从拉取队列中抓取一条消息,将其标记为正在进行中,这样就没有其他工作人员试图抓取它,完成它的工作并在处理完成后确认消息。每个工人最多可能需要一个小时来完成此处理。如果发生异常,我想删除 "in progress" 状态并允许其他工作人员接收此消息并尝试对其进行处理。
我希望 pubsub 中有一些东西可以让我做到这一点。我的替代方法是,在处理之前,将带有消息 id、ack id、status=pending、timestamp=now() 的实体 (inProgressMessage) 存储到数据存储中,让工作人员在收到消息后立即 return ackid (这将允许其他工作人员尝试其他消息),然后工作人员可以处理冗长的任务。如果成功,将实体状态标记为完成,如果以非永久方式失败,则将任务重新排队到 pubsub,如果以不允许重新排队的永久方式失败,我可以让 cron 检查数据存储中是否有比几个更早的待处理任务小时,并让它们被删除或重新排队。
我的替代方案感觉就像我重新实现了很多 pub sub 应该提供帮助的东西。
如果你能想到更好的方法,请告诉我。
创建主题时(仅),您可以将确认时间配置为最多 10 分钟 (https://cloud.google.com/pubsub/subscriber)。一旦消息从队列中被拉出,没有其他工作人员(同一订阅者)将能够处理它,除非达到 ack ttl,然后消息自动返回到队列。
由于你需要更长的周期,你将不得不自己实现一些东西,或者寻求其他排队解决方案。我认为您建议的设计实现起来相当简单,并不是真正的 pubsub 功能的重新实现。
要花费比确认截止时间更长的时间来处理消息,您需要使用 modifyAckDeadline。您可以根据需要多次延长截止日期,每次通话最多 10 分钟。您的工作流程如下:
- 拉取消息。
- 开始处理邮件。
- 虽然您尚未处理完消息,但如果您接近 10 分钟的确认截止日期,请调用 modifyAckDeadline 以延长截止日期。
- 处理完消息后,确认它。
请注意,调用 modifyAckDeadline 并不能保证消息不会被传送到另一个任务。在服务器重启等特定情况下,消息可能最终会传送给您的另一个订阅者。但是,在大多数正常情况下,只要在当前 ack 截止日期之前调用 modifyAckDeadline,就可以在必要时阻止消息的重新投递。
我正在尝试使用拉入队列创建一个图像处理任务队列,该队列可能需要超过 10 分钟的 acktimeout 限制。我正在使用 node.js api 我想知道如何让工作人员从拉取队列中抓取一条消息,将其标记为正在进行中,这样就没有其他工作人员试图抓取它,完成它的工作并在处理完成后确认消息。每个工人最多可能需要一个小时来完成此处理。如果发生异常,我想删除 "in progress" 状态并允许其他工作人员接收此消息并尝试对其进行处理。
我希望 pubsub 中有一些东西可以让我做到这一点。我的替代方法是,在处理之前,将带有消息 id、ack id、status=pending、timestamp=now() 的实体 (inProgressMessage) 存储到数据存储中,让工作人员在收到消息后立即 return ackid (这将允许其他工作人员尝试其他消息),然后工作人员可以处理冗长的任务。如果成功,将实体状态标记为完成,如果以非永久方式失败,则将任务重新排队到 pubsub,如果以不允许重新排队的永久方式失败,我可以让 cron 检查数据存储中是否有比几个更早的待处理任务小时,并让它们被删除或重新排队。
我的替代方案感觉就像我重新实现了很多 pub sub 应该提供帮助的东西。
如果你能想到更好的方法,请告诉我。
创建主题时(仅),您可以将确认时间配置为最多 10 分钟 (https://cloud.google.com/pubsub/subscriber)。一旦消息从队列中被拉出,没有其他工作人员(同一订阅者)将能够处理它,除非达到 ack ttl,然后消息自动返回到队列。
由于你需要更长的周期,你将不得不自己实现一些东西,或者寻求其他排队解决方案。我认为您建议的设计实现起来相当简单,并不是真正的 pubsub 功能的重新实现。
要花费比确认截止时间更长的时间来处理消息,您需要使用 modifyAckDeadline。您可以根据需要多次延长截止日期,每次通话最多 10 分钟。您的工作流程如下:
- 拉取消息。
- 开始处理邮件。
- 虽然您尚未处理完消息,但如果您接近 10 分钟的确认截止日期,请调用 modifyAckDeadline 以延长截止日期。
- 处理完消息后,确认它。
请注意,调用 modifyAckDeadline 并不能保证消息不会被传送到另一个任务。在服务器重启等特定情况下,消息可能最终会传送给您的另一个订阅者。但是,在大多数正常情况下,只要在当前 ack 截止日期之前调用 modifyAckDeadline,就可以在必要时阻止消息的重新投递。