Azure Service Bus主题:如何启用并发读者?

时间:2017-04-07 07:41:57

标签: azure azureservicebus brokeredmessage

背景

我正在使用Azure Service Bus。在命名空间内,我有一个主动订阅的主题。我有一个生产者推送消息到主题,我有n个服务订阅相同的订阅(出于可伸缩性的原因)。这些服务使用PeekLock()来获取消息,对它们执行一些工作,然后在工作完成后通过Complete()释放消息锁。

问题

每当服务锁定一条消息时,似乎没有新服务能够从同一主题/订阅中获取消息。似乎整个主题都被锁定了,而不仅仅是锁定自身的消息。

实际的问题是我有服务只是在做什么,只是等待服务与活动的PeekLock()完成。

问题

  1. 有没有办法在主题(和订阅)或队列中启用并发读者(或并发锁定)?

  2. 我上面解释过的(对我来说不需要的)情景 - 按照收到的顺序传递邮件是某种保证的结果吗?

    < / LI>

    代码段:Csharp

    public static void main(...) 
    {
      // configure the options
      OnMessageOptions messageOptions = new OnMessageOptions();
      messageOptions.AutoComplete = false;
    
      // look for messages
      serviceBusClient.OnMessage(msg => processMessage(msg, connectionKey), messageOptions);
    }
    
    
    private static void processMessage(BrokeredMessage msg, string connectionKey)
    {
      try
      {
        // do stuff to the message
        //...
    
        // for debugging: no new clients grab messages 
        // while this client has lock active. the sleep
        // is to simulate heavy work load
        Thread.Sleep(5000);
    
        // release lock on message
        msg.Complete();
      }
    
      catch (Exception e)
      {
        msg.Abandon();
      }
    }
    

3 个答案:

答案 0 :(得分:0)

您是否使用Recieve()Receieve(Int64)方法(或异步变体)接收消息?

您必须知道锁定位于消息本身,而不是订阅/队列。但是,如果你使用Int64的重载并给出如此大的数字 - 你得到(锁定)所有消息,而你的其他进程则无法做什么。

无法在Azure Service Bus中锁定订阅。 limit of concurrent subscription receievers 5000

Here您可以阅读有关服务总线消息传递中的性能的更多信息。

下次您提出问题时,请为我们提供一个代码段,以便我们更好地了解您的问题!

答案 1 :(得分:0)

您可以尝试明确地将客户端上的PrefetchCount设置为0,根据this page它默认为默认,但我怀疑如果您发现没有其他客户端可以得到消息:

from django.utils.safestring import mark_safe

erotrotsity = forms.DecimalField(max_digits=7, decimal_places=3, label=mark_safe('Erot<sup>12</sup>'), required=False, validators = [MinValueValidator(0)])

答案 2 :(得分:-1)

您的案例中最简单的解决方案可能是使用分区主题/队列,请参阅https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioning