如何将邮件标记为“正在进行中”,以便其他工作人员不对其进行操作

时间:2016-05-10 23:17:52

标签: google-cloud-pubsub

我正在尝试使用拉取队列来创建一个图像处理任务队列,这可能需要比acktimeout限制10分钟更长的时间。我正在使用node.js api,我想知道如何让一个工作人员从拉取队列中获取一条消息,将其标记为正在进行中,以便其他工作人员不会尝试抓取它,执行其工作并在确认消息之后确认消息处理完成。这种处理可能需要每个工人一个小时。如果发生异常,我想删除“进行中”状态,并允许其他工作人员接收此消息并尝试对其进行处理。

我希望pubsub中有一些东西可以让我这样做。我的替代方法是,在处理之前,将实体(inProgressMessage)与消息id,ack id,status = pending,timestamp = now()存储到数据存储区中,让工作人员在收到消息后立即返回ackid(这将允许其他工人尝试其他消息),然后工人可以完成冗长的任务。如果成功,则将实体状态标记为完成,如果以非永久方式失败,则将任务重新排队到pubsub,如果以永久方式失败而不允许执行,我可以让cron检查数据存储区是否存在多于几个的挂起任务小时,让他们删除或重新排队。

我的选择感觉就像我正在重新实现pub sub应该帮助的东西。

如果你能想出更好的方法,请告诉我。

2 个答案:

答案 0 :(得分:4)

要花费比ack截止日期更长的时间来处理邮件,您需要使用modifyAckDeadline。您可以根据需要将截止时间延长多达10分钟。您的工作流程如下:

  1. 拉消息。
  2. 开始处理消息。
  3. 如果您没有收到该消息,如果您接近10分钟的确认截止日期,请致电modifyAckDeadline以延长截止日期。
  4. 处理完消息后,请确认。
  5. 请注意,调用modifyAckDeadline不会保证该邮件不会传递给其他任务。在某些情况下,例如服务器重新启动,该消息可能最终会传递给您的另一个订阅者。但是,在大多数正常情况下,只要您在当前的ack截止日期之前调用modifyAckDeadline,就可以防止在必要时重新传递消息。

答案 1 :(得分:0)

创建主题(仅限)时,您可以将确认时间配置为 10分钟https://cloud.google.com/pubsub/subscriber)。一旦从队列中提取了一条消息,除非达到了ack ttl,否则没有其他工作人员(同一用户)能够接受处理,然后该消息将自动返回队列。

由于您需要更长的时间,您必须自己实施某些功能,或寻求其他排队解决方案。我认为你提出的设计实现起来相当简单,并不是对pubsub的重新实现。