Azure的EventData.PartitionKey如何决定写入哪个分区?

我正在尝试在Azure中实现事件中心。 我设法创建了一个生产者,它将消息发布到事件中心,以及一个消费者将其读取。 我的事件中心分为16个分区。 在消费者方面,我循环遍历以下各项:

var eventHub = NamespaceManager.CreateFromConnectionString(builder.ToString()).GetEventHub("de-analytics-events"); foreach (var partitionId in eventHub.PartitionIds) { subscriberGroup.RegisterProcessor(new Lease { PartitionId = partitionId }, new EventProcessorCheckpointManager()); Console.WriteLine("Processing: " + partitionId); } 

在调试器中查看这些值表明,在16个分区的情况下, eventHub.PartitionIds范围从“0”到“15”。

但是,在生产者方面,我被允许指定的是我的EventData.PartitionKey ,它是一个字符串,但它不直接对应于消费者端的字符串。 例如,如果我指定了PartitionKey =“7”,则它不一定写入分区“7”。

阅读显示涉及某种哈希,但我并不特别想随机猜测16个字符串,这些字符串哈希到数字0-15。 所以我想知道如何定义发布到哪个分区?

为了补充参考, 这是我遵循的教程,以使我最简单的案例工作。

你是对的,哈希用于将分区键转换为给定的分区。 我所拥有的问题是,只要哈希算法均匀且一致地分配事件,为什么要真正关心将消息分配给哪个分区?

是的,你可以说你想知道所以你知道接收者是谁。 但事实是,像这样的紧密耦合使解决方案本身就很脆弱。 你打赌让服务做它需要做的事情来保持流量健康,并意识到一旦你使用给定的分区密钥获得消息,你很可能总是使用该密钥获取消息。

更大的挑战是确保您使用的分区密钥策略有助于确保跨分区的事件分布相当均匀(也就是说不会给10,000个设备提供相同的分区密钥)。

指定PartitionKey将确保将具有相同密钥的所有事件发送到同一分区,并为分区内的这些事件维护顺序。

您对处理方面的数据有这样的要求吗?

如果您没有此类要求,则建议“不设置PartitionKey”。 这种方式事件中心代理将统一分配事件在分区之间。

如果您确实在PartitionKey中拥有数据的订单保证要求,并且您拥有少量发布者,则可以使用分区发件人手动处理分区和分配负载。
有关如何使用分区发件人的信息,请参阅此链接。 http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.createpartitionedsender.aspx