我正在使用Azure Service Bus。在命名空间内,我有一个主动订阅的主题。我有一个生产者推送消息到主题,我有n个服务订阅相同的订阅(出于可伸缩性的原因)。这些服务使用PeekLock()来获取消息,对它们执行一些工作,然后在工作完成后通过Complete()释放消息锁。
每当服务锁定一条消息时,似乎没有新服务能够从同一主题/订阅中获取消息。似乎整个主题都被锁定了,而不仅仅是锁定自身的消息。
实际的问题是我有服务只是在做什么,只是等待服务与活动的PeekLock()完成。
有没有办法在主题(和订阅)或队列中启用并发读者(或并发锁定)?
我上面解释过的(对我来说不需要的)情景 - 按照收到的顺序传递邮件是某种保证的结果吗?
< / LI> 醇>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();
}
}
答案 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