我正在使用一个使用azure服务总线队列的命令处理应用程序 . 命令从网站发出并发布到队列,队列消息由工作者角色处理 . 处理涉及根据队列消息值从db和其他源获取数据并将其发送到不同的主题 . 流程是,
-
接收消息
-
处理邮件
-
将消息标记为完成/放弃消息处理异常时 .
我在这里面临的挑战是处理时间 . 有时它超过了最大消息锁定时间段(5分钟 - 配置),因此消息被解锁并重新显示以供工作者角色获取(考虑工作者角色的多个实例) . 因此,这会导致再次处理相同的消息 .
我有什么选择来处理这种情况 .
我想过,
-
接收消息 - 添加到本地变量 - 标记消息完成 . 在异常的情况下,再次将消息发送到队列或单独的队列(让我们说失败的消息队列) . 第二个队列还意味着另一个工作者角色来处理它 .
-
在处理过程中有一个foreach循环运行 . 所以我想到了使用Parallel.Foreach . 但不确定它会给出多少时间,并且在天蓝色中使用Parallel时也会阅读一些有关问题的帖子 .
建议,修复欢迎 .
3 回答
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
您可能需要考虑使用Azure Queue,Azure队列消息的最长租约时间为7天,而Azure Service Bus Queue租约时间为5分钟 .
This msdn article描述了两种Azure队列类型之间的差异 .
如果标准Azure队列不包含您需要的所有功能,则可以考虑使用两种类型的队列 .
您可以使用心跳操作来启动任务,该操作会在您处理时为您续订锁定 . 这正是我的工作 . 我在Creating a Task with a heartbeat描述了我的方法