Azure服务总线-避免并行处理来自同一设备的消息

Azure服务总线-避免并行处理来自同一设备的消息,azure,concurrency,azureservicebus,Azure,Concurrency,Azureservicebus,许多设备正在发送消息,这些消息最终位于单个Azure服务总线队列(或主题)中。我们希望并行处理多条消息,但我们希望避免在任何给定时间同时处理同一设备的两条消息 以下图片说明了目标。有3个处理线程(实际上可能有几十个,分布在多个服务器之间)。每个框表示单个消息的处理时间,颜色显示它所属的设备 您可以看到,在任何时候都不会有来自同一设备的两条或多条重叠消息 由于涉及多个处理服务器,我可以想象,防止并发处理的唯一方法是使用设备ID作为分区键对消息进行分区,然后每个分区只有一个使用者: 所以,所有来

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

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

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

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

所以,所有来自“黄色设备”的消息都会转到分区1,依此类推

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

var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
var options = new OnMessageOptions { MaxConcurrentCalls = x };
client.OnMessage(m =>
    {
        // Process...
        m.Complete();
    });
如何将并发限制合并到此类代码中


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

这看起来是利用ASB
s会话功能的一个很好的选择。您可以在Message`API上使用
,但对给定会话的处理只能由一个使用者完成,不能由多个使用者完成。此外,您还可以并发运行,在负载到来时处理负载


一个好的起点是看API。如果您想要一份完整的文档,并解释其工作原理,那么这是您能找到的最好的文档。

我看过了会话,但得到了一个(不正确的?)印象,即它们旨在将相关消息的处理分组到一个事务中。感谢Azure示例的链接,我需要的似乎是
IMessageSessionAsyncHandler
。我还不确定在无限会话生存期的情况下是否必须在某个时刻关闭会话。这是正确的。我已经把你的信息分为“流”不是无限的。因此,将代表一次会议。如果情况并非如此,会话不是您的正确选择。在特定情况下,我认为streams的寿命有限,但可能长达几天,而且很难说最后一条消息是什么时候收到的。在与竞争对手打交道时,按顺序处理消息并保持消费者亲和力通常不是一个好主意。ASB就是这样一个例子。没有其他想法:(我们已经在解决方案中实现了会话,现在正在使用几个队列对它们进行测试。到目前为止还不错,所以我将此标记为答案。谢谢Sean!