【问题标题】:What is the partition message routing algorithm in azure service busazure服务总线中的分区消息路由算法是什么
【发布时间】:2017-08-10 15:23:04
【问题描述】:

我想确保我的消息均匀分布在服务总线的分区中。我们目前正在发送带有 sessionId 设置为 id.ToString() 的消息,其中 Id 是一个整数。但是,我想知道这是否足以很好地分发消息。据我所知,无法确认会话是如何分配的,因此无法对此进行测试。

我可以在此示例中看到会话 ID 的前缀为“会话”https://github.com/Azure/azure-service-bus/tree/master/samples/DotNet/Microsoft.Azure.ServiceBus/BasicSessionSendReceiveUsingQueueClient

这与我的问题是否巧合?或者如果我的 sessionId 将来自一个整数,这是我应该做的事情吗?这里的问题是,如果服务总线使用诸如服务结构的范围分区方案,那么彼此接近的整数值将被放置在同一个分区上。

编辑:具体来说,这个问题是关于确保消息在服务总线内的分区之间均匀分布(不是负载平衡竞争的会话消费者) - 我已经更新了这个问题以更好地反映这一点。

谢谢,

【问题讨论】:

  • 示例中使用的前缀可以是“session”以外的任何值。会话 ID 用于标识会话。在分配负载方面,最大并发会话数乘以处理节点数将占用会话数。我猜剩下的是竞争消费者。
  • 谢谢@SeanFeldman - 我的问题专门与服务总线中的分区之间的消息分布有关。不是跨消费者的会话分布。我认为这可以更普遍地应用于 PartitionKey 的使用。

标签: azureservicebus


【解决方案1】:

What are partitioned queues and topics?解释如下:

简而言之,分区队列或主题的工作方式如下:每个分区队列或主题由多个片段组成。每个片段都存储在不同的消息存储中,并由不同的消息代理处理。 当消息发送到分区队列或主题时,服务总线会将消息分配给其中一个片段。选择由服务总线或发送者指定的分区键随机完成

当消息被排入分区队列或主题时,服务总线检查是否存在分区键。如果找到一个,它会根据该键选择片段。 如果没有,它会根据内部算法选择片段使用分区键 某些场景,例如 sessionstransactions,需要将消息存储在某个片段中。所有这些场景都需要使用分区键。使用相同分区键的所有消息都分配给相同的片段。根据场景,不同的消息属性被用作分区键。

对于会话场景,它声明如下:

如果消息设置了 SessionId 属性,则服务总线使用 SessionId 属性作为分区键。这样,属于同一会话的所有消息都分配给同一片段并由同一消息代理处理。这允许服务总线保证消息顺序以及会话状态的一致性。

此外,如果您未指定将用作分区键的消息属性(SessionIdPartitionKeyMessageId),则服务总线以循环方式分发消息 到分区队列或主题的所有片段。如果所选片段不可用,服务总线会将消息分配给不同的片段。

更多详情可以参考Partitioned Service Bus Queues and Topics

【讨论】:

  • 感谢您的评论布鲁斯。我已经为那篇文章倾注了很多次。它缺少的是如何“根据该键选择片段”的解释。例如,它可以使用模运算。或者它可以使用范围分区...我敢肯定有很多...但是 AzureServiceBus 使用什么?
  • 我已经检查了关于基于该键选择片段的算法没有记录。如果您想知道 azure service bus 是如何实现的,您可以在Partitioned queues and topics 下添加您的评论或在here 下添加您的反馈。
  • 反馈最好在GitHub issue trackerdocumentation 标签下提供。
猜你喜欢
  • 2014-05-16
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多