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