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

mik*_*ike 4 c# azure

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

var eventHub = NamespaceManager.CreateFromConnectionString(builder.ToString()).GetEventHub("de-analytics-events");

foreach (var partitionId in eventHub.PartitionIds)
{
     subscriberGroup.RegisterProcessor<EventProcessor>(new Lease
     {
         PartitionId = partitionId
     }, new EventProcessorCheckpointManager());

     Console.WriteLine("Processing: " + partitionId);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Bre*_*key 6

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

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

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


小智 5

指定PartitionKey将确保所有具有相同键的事件都发送到相同的分区,并且在分区内为这些事件保持顺序。

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

如果您没有这样的要求,那么建议您“不设置PartitionKey”。这样,事件中心代理将在各个分区之间均匀分布事件。

如果您确实对PartitionKey中的数据有订单保证要求,并且发布者数量很少,那么可以使用手动方法来处理分区并使用Partitioned Sender分配负载。
有关如何使用分区发件人的信息,请参阅此链接。 http://msdn.microsoft.com/zh-cn/library/microsoft.servicebus.messaging.eventhubclient.createpartitionedsender.aspx