用于处理azure服务总线队列中的消息处理的选项

时间:2013-01-02 17:39:44

标签: c# .net azure servicebus

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

  1. 接收消息
  2. 处理消息
  3. 将消息标记为完成/放弃消息处理异常。
  4. 我面临的挑战是处理时间。有时它超过了最大消息锁定时间段(5分钟 - 配置),因此消息被解锁并重新显示以供工作者角色获取(考虑工作者角色的多个实例)。因此,这会导致再次处理相同的消息。

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

    我想过,

    1. 接收消息 - 添加到本地变量 - 标记消息完成。 如果发生异常,请将消息再次发送到队列或发送给 单独的队列(让我们说失败的消息队列)。第二个队列 也意味着另一个工人角色来处理它。

    2. 在处理中有一个运行的foreach循环。所以我想到了 使用Parallel.Foreach代替。但不确定多少时间 获得它会给出并在使用时阅读一些有关问题的帖子 在天蓝色中平行。

    3. 建议,修复欢迎。

3 个答案:

答案 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

描述了我的方法