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