1

我正在开发一个使用 azure 服务总线队列的命令处理应用程序。命令从网站发出并发布到队列,队列消息由工作角色处理。处理包括根据队列消息值从数据库和其他来源获取数据并将其发送到不同的主题。流量是 ,

  1. 接收消息
  2. 处理消息
  3. 将消息标记为完成/放弃消息处理异常。

我在这里面临的挑战是处理时间。有时它超过了最大消息锁定时间段(5 分钟 - 配置),因此消息被解锁并重新出现以供工作人员角色拾取(考虑工作人员角色的多个实例)。所以这会导致再次处理相同的消息。

我必须有哪些选择来处理这种情况。?

我想过,

  1. 接收消息 - 添加到局部变量 - 标记消息完成。如果出现异常,请再次将消息发送到队列或单独的队列(假设消息队列失败)。第二个队列也意味着另一个工作角色来处理它。

  2. 在处理过程中有一个运行的 foreach 循环。所以我想用 Parallel.Foreach 代替。但不确定它会获得多少时间,并且还阅读了一些关于在 azure 中使用 Parallel 时遇到的问题的帖子。

欢迎提出建议,修正。

4

3 回答 3

1

Aravind,您绝对可以在这种情况下使用 SB 队列。使用最新的 SDK,只要您继续处理它,您就可以更新对您的消息的锁定。详细信息位于:http: //msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.renewlock.aspx

这类似于更新可见性超时的 Azure 存储队列功能:http: //msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storage.queue.cloudqueue.updatemessage.aspx

于 2013-01-03T18:46:20.783 回答
0

您可能需要考虑使用Azure Queue,Azure Queue 消息的最长租用时间为 7 天,而 Azure Service Bus Queue 的租用时间为 5 分钟。

这篇 msdn 文章介绍了两种 Azure 队列类型之间的差异。

如果标准 Azure 队列不包含您需要的所有功能,您可以考虑使用这两种类型的队列。

于 2013-01-03T04:13:08.357 回答
0

您可以使用心跳操作触发任务,该操作会在您处理它时不断为您更新锁。这正是我所做的。我在用心跳创建任务中描述了我的方法

于 2013-06-14T22:04:07.787 回答