队列中心工作模式的故障处理

时间:2017-02-24 02:08:16

标签: azure message-queue task-queue azure-queues

我打算为我的一个应用程序使用here描述的以队列为中心的设计。这基本上包括使用Azure队列,其中工作请求从UI排队。工作人员从队列中读取,处理并删除队列中的消息。

'工作'由工作人员在一个事务中完成,因此如果工作人员在完成之前失败,则在重新启动时它会再次拾取相同的消息(因为它没有从队列中删除)并尝试再次执行操作(最多为重试)

缩放我可以使用两种方法:

  1. 多个工作人员,每个人都有一个单独的队列。因此,如果我有五个工作伙伴W1到W5,我有5个队列Q1到Q5,每个工作人员知道要读取哪个队列,故障处理与一个队列和一个工作人员的情况类似
  2. 一个队列和多个工作人员。这里的失败/重试处理将更加复杂,最终可能会使用' Invisibility'消息队列中的时间,以确保没有两个工人拿起相同的工作。必须计算隐身时间以确保其足以完成作业,但又不足以在很长时间后执行重试。
  3. 想知道第一种方法是否正确?在上面的第二种方法中,处理故障的有效方法是什么?

1 个答案:

答案 0 :(得分:2)

你最好采取方法2 - 单个队列,但有多个工作人员。

这更好,因为:

  • 将消息传递到队列的过程只需要知道单个队列端点。这样可以降低复杂性;
  • 现在,将从队列中提取的工作人员数量与任何代码/配置更改分开 - 您可以更轻松地(在运行时)进行扩展和缩小。

如果您担心visibility,您最初可以选择默认timespan,然后如果工作人员看起来花了太长时间,它可以定期致电UpdateMessage()进行更新消息的可见性。

最后,如果您的工作人员超时并且未能完成对该消息的处理,则其他工作人员将再次接收该消息以再次尝试。您还可以使用消息的DequeueCount属性来管理重试次数。