Mik*_*kov 5 concurrency azure azureservicebus
许多设备正在发送消息,这些消息最终进入单个 Azure 服务总线队列(或主题)。我们希望并行处理多个消息,但我们希望避免在任何给定时间并发处理同一设备的两个消息。
下图说明了目标。有 3 个处理线程(实际上可能有几十个,分布在多个服务器之间)。每个方框表示单个消息的处理时间,颜色表示它属于哪个设备。
您可以看到,在任何时间点都没有来自同一设备的两个或多个重叠消息。
由于涉及多个处理服务器,我可以想象防止并发处理的唯一方法是以设备 ID 作为分区键对消息进行分区,然后每个分区只有一个消费者:
因此,来自“黄色设备”的所有消息都会发送至分区 1,依此类推。
我仍然想在单个进程中运行多个处理线程。现在,我们做一些简单的事情,比如
var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
var options = new OnMessageOptions { MaxConcurrentCalls = x };
client.OnMessage(m =>
{
// Process...
m.Complete();
});
Run Code Online (Sandbox Code Playgroud)
如何将并发限制合并到此类代码中?
我可以想象一些基于参与者或其他并发机制的客户端解决方案。但有没有办法在 Broker 层面解决这个问题呢?
这看起来是利用 ASB s Sessions feature. You will be able to use
OnMessage` API 的一个很好的选择,但是给定会话的处理只能由单个使用者完成,而不是多个使用者。此外,您还可以同时运行,处理负载。
一个好的起点是查看QueueClient.AcceptMessageSessionAsync
API。如果您想要一份可靠的文档并解释其工作原理,那么此示例是您能找到的最好的文档。
归档时间: |
|
查看次数: |
3948 次 |
最近记录: |