我正在尝试使用拉取队列来创建图像处理任务队列,这些任务可能需要比 10 分钟的 acktimeout 限制更长的时间。我正在使用 node.js api,我想知道如何让工作人员从拉取队列中抓取一条消息,将其标记为正在进行中,这样其他工作人员就不会尝试抓取它,完成它的工作并在之后确认消息处理完成。此处理可能需要每个工人一个小时。如果发生异常,我想删除“进行中”状态并允许其他工作人员获取此消息并尝试处理它。
我希望 pubsub 中有一些东西可以让我这样做。我的替代方法是,在处理之前,将带有消息 id、ack id、status=pending、timestamp=now() 的实体(inProgressMessage)存储到数据存储中,让工作人员在收到消息后立即返回 ackid(这将允许其他工作人员尝试其他消息),然后工作人员可以处理冗长的任务。如果成功,将实体状态标记为完成,如果以非永久方式失败,将任务重新排队到 pubsub,如果以不允许重新排队的永久方式失败,我可以让 cron 检查数据存储中是否存在比几个旧的待处理任务小时并让它们被删除或重新排队。
我的替代方案感觉就像我正在重新实现 pub sub 应该帮助的很多内容。
如果您能想到更好的方法,请告诉我。