2017-08-09 97 views
0

我想确保我的消息在各分区服务总线均匀分布路由算法。我们目前有一个sessionId被设置为id.ToString()的消息,其中Id是一个整数。但是,我想知道,如果这足以足以分发消息。据我所知,没有办法确定如何分配会议,所以没有办法来测试这个。什么是分区的消息在蔚蓝的服务总线

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

这是不是巧合我的问题?或者,这是我应该做的事情如果我的sessionId将从一个整数派生?这里的问题是,如果服务总线使用范围分区方案,诸如服务织物,然后是彼此接近将被放置在同一分区的整数值。

编辑:具体而言,这个问题是如何确保邮件在服务总线内部的分区均匀分布(不负载平衡的会话competiting消费者) - 我已经更新的问题,以更好地反映这一点。

谢谢,

+0

样本中使用的前缀可以是除“会话”以外的任何值。会话ID用于标识会话。在分配负载方面,最大并发会话数量乘以处理节点数量将会占用会话数量。其余的是我猜想的竞争消费者。 –

+0

谢谢@SeanFeldman - 我的问题是专门针对跨服务总线上分区的消息分布..不会分配给消费者。我认为这可以更一般地应用于PartitionKey的使用。 –

回答

0

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

概括地说,一个分区队列或话题的工作原理如下:每个分区队列或话题由多个片段的。每个片段存储在不同的消息传递存储中,并由不同的消息代理处理。 当一个消息被发送给一个分区队列或话题,服务总线消息分配给片段之一。该选择由服务总线或发件人指定的分区密钥随机完成。

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

对于会议场景中,规定如下:

如果消息有的SessionID属性集,然后服务总线使用SessionID属性为分区键。这样一来,都属于同一个会话的消息被分配到相同的片段,由同一消息代理处理。这允许服务总线保证消息顺序以及会话状态的一致性。

此外,如果不指定消息属性,其将被用作分区键(SessionIdPartitionKeyMessageId),则服务总线分布在以循环方式消息,将分区的所有片段队列或主题。如果所选片段不可用,则Service Bus将该消息分配给不同的片段。

有关更多详细信息,请参阅Partitioned Service Bus Queues and Topics

+0

感谢您的评论布鲁斯。我已经多次倾倒那篇文章。它缺少的是如何“根据该键选择片段”的解释。例如,它可以使用模操作。或者它可以使用远程分区......我确定有很多...但AzureServiceBus使用什么? –

+0

我检查过没有记录基于该键选择片段的算法。如果您想知道azure服务总线如何实现它,您可以在[分区队列和主题](https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-总线分区)或添加您的反馈[这里](https://feedback.azure.com/forums/216926-service-bus)。 –

+0

反馈更好提供在[文档]标签下的[GitHub问题跟踪器](https://github.com/Azure/azure-service-bus/issues)。 –