使用MaxDeliveryCount进行Azure ServiceBus消息重新处理

时间:2017-05-09 09:09:36

标签: azure azureservicebus

我尝试使用ServiceBus订阅的MaxDeliveryCount来实现邮件处理的重试。不确定这是最好的主意,但不想丢失消息。

场景:

  1. 有一个主题,两个订阅者一个发送(A)和另一个 (B)使用Peek-Lock
  2. 接收消息
  3. 两个订阅都配置了MaxDeliveryCount = 10
  4. 两位客户都使用 SubscriptionClient.ReceiveBatch(50,TimeSpan.FromMilliseconds(50))来     从队列中获取消息
  5. A发送5条消息,有效载荷" 1"," 2",..." 5"
  6. 第一条消息(" 1")无法在B上处理并被标记为已放弃(BrokeredMessage.Abandon())

    原因:由于内部原因,应用现在无法处理此消息。

    自DeliveryCount<之后,它还没有BlackLettered MaxDeliveryCount)

  7. 接下来,由于消息" 1"以前失败了,只有一条消息 要求,并且它应该是消息" 1" SubscriptionClient.ReceiveBatch(1,TimeSpan.FromMilliseconds(50))
  8. 在步骤7重复2-3次后,而不是接收消息" 1", 消息" 2"收到消息" 2"也被标记为被遗弃 因为消息" 1"预计
  9. 然后留言" 3"收到了     消息" 3"也被标记为已放弃,因为消息" 1"是     预期

    依此类推。

  10. 在这种情况下,似乎SB正在以循环方式传递消息。

    这是ServiceBus的预期行为吗?

    我知道是否存在一些争论,SB是否保证有序交付。对于应用程序来说,按照发送消息的顺序处理消息非常重要。

    任何想法如何重新处理消息" 1"可以在DeliveryCount达到MaxDeliveryCount之前执行,然后再处理消息" 2"?

1 个答案:

答案 0 :(得分:0)

首先,正如Thomas在评论中所说,您可以尝试为主题指定SupportOrdering property true

TopicDescription td = new TopicDescription("TopicTest");
td.SupportOrdering = true;

如果订阅客户端收到一条消息并调用Abandon方法放弃对隐藏锁定消息的锁定,我们可以再次调用Receive方法再次获取它,就像这样。

enter image description here

输出:

enter image description here

另一方面,如果可能,您可以尝试将完整的工作步骤与单个消息中的特定订单相结合,而不是在多个消息中拆分步骤,然后您可以控制处理在您的代码逻辑中按特定顺序,而不是在服务总线基础结构上回复以提供此保证。