Azure 服务总线分区和排序

问题描述 投票:0回答:1

我在文档中找不到有关 Azure 服务总线分区的问题。

场景如下:

我们的系统有大量的服务请求消息。它们适用于特定的人。我们有如此多的消息,以至于我们需要有许多消息处理服务实例来拉取消息并进行处理。我们处理消息的顺序并不重要,但单人消息需要按顺序处理。例如,如果我们收到一条请求为 123 人提供服务的消息,然后另一条消息修改了为 123 人提供服务的请求,我们需要按照收到的顺序处理它们。

看分区,好像可以传入人的ID作为分区键。这将确保消息在每个分区代理上正确排序。但是,我担心消息的处理。

我想如果我们将队列设置为分区,那么每个分区一次只能处理 1 条消息。但我似乎找不到任何证实这一点的文件。如果是这样,那么这将确保我们不会有一个人的消息在队列中相互传递。

Azure 服务总线是否强制执行“每个分区 1 条未解决的消息”限制?

注意:我读过有关会话的信息,但它们似乎仅在您拥有一组预先知道且有限的组时才有效。我拥有的 Person ID 列表非常庞大,尝试为每个人设置一个会话接收器很快就会失控。

azure azureservicebus
1个回答
0
投票

分区似乎不是你要找的。创建分区实体时,服务总线将每个分区存储在单独的存储中并由不同的代理处理。读取时,无法保证排序 - 服务总线查询所有分区的消息并从首先响应的分区返回消息。可以在分区队列和主题中找到更详细的讨论。

Sessions,另一方面,听起来像你正在寻找的东西。每个会话都有一个关联的锁,并且只能由一个活动读者读取。我不确定你为什么认为你需要提前知道会话数,但我知道没有 quota 限制限制会话数。

对于处理,如果您愿意,您可以使用单个 ServiceBusSessionProcessor 并循环遍历所有会话 - 或者尽可能多,以便您可以同时处理会话。

如果您希望更明确地控制事物,使用 ServiceBusClient 上的

AcceptNextSession
方法可以让您生成一个与特定会话关联的临时接收器,您将从中读取并在完成该会话后关闭。

© www.soinside.com 2019 - 2024. All rights reserved.