Azure Service Bus - 避免并行处理来自同一设备的消息

时间:2016-10-27 12:47:30

标签: azure concurrency azureservicebus

许多设备正在发送最终位于单个Azure Service Bus队列(或主题)中的消息。我们希望并行处理多个消息,但我们希望避免在任何给定时间同时处理同一设备的两条消息

以下图片说明了目标。有3个处理线程(实际上可能有几十个,分布在多个服务器之间)。每个框表示单个消息的处理时间,颜色显示它属于哪个设备。

Concurrent processing of the messages

您可以看到,在任何时候都不会有来自同一设备的两条或更多重叠消息。

由于涉及多个处理服务器,我可以想象防止并发处理的唯一方法是使用设备ID作为分区键对消息进行分区,然后每个分区只有一个消费者:

enter image description here

所以,来自"黄色设备的所有消息"转到分区1,依此类推。

我仍然希望在单个进程中运行多个处理线程。现在,我们做了一些简单的事情,比如

var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
var options = new OnMessageOptions { MaxConcurrentCalls = x };
client.OnMessage(m =>
    {
        // Process...
        m.Complete();
    });

如何将并发限制纳入此类代码?

我可以想象一些基于actor或其他并发机制的客户端解决方案。但是有没有办法在Broker级别解决这个问题?

1 个答案:

答案 0 :(得分:3)

这看起来是利用ASB s Sessions feature. You will be able to use OnMessage` API的一个很好的候选者,但是给定会话的处理只能由单个消费者完成,而不是多个消费者。此外,您将能够同时运行,处理负载。

一个好的起点是查看QueueClient.AcceptMessageSessionAsync API。如果你想要一个可靠的文档说明它是如何工作的,this sample是你能找到的最好的doco。