我正在尝试在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);
}
在调试器中查看这些值表明,在{16}的情况下,eventHub.PartitionIds
范围从“0”到“15”。
然而,在生产者方面,我被允许指定的只是我的EventData.PartitionKey
,这是一个字符串,但它不直接对应于消费者方面的字符串。例如。如果我指定了PartitionKey =“7”,则它不一定写入分区“7”。
阅读显示涉及某种散列,但我并不特别想随机猜测16个字符串,这些字符串散列到数字0-15。所以我想知道如何定义发布到哪个分区?
为了补充参考,this是我为了使我最简单的案例工作而遵循的教程。
答案 0 :(得分:6)
你是对的,哈希用于将分区键转换为给定的分区。我所拥有的问题是,只要哈希算法均匀且一致地分配事件,为什么要真正关心将消息分配给哪个分区?
是的,你可以说你想知道所以你知道接收者是谁。但事实是,像这样的紧密耦合使解决方案本身就很脆弱。你打算让服务做他们需要做的事情来保持流量健康,并意识到一旦你使用给定的分区密钥获得消息,你很可能总是使用该密钥获取消息。
更大的挑战是确保您使用的分区密钥策略有助于确保跨分区的事件分布相当均匀(也就是说不会给10,000个设备提供相同的分区密钥)。
答案 1 :(得分:4)
指定PartitionKey将确保将具有相同密钥的所有事件发送到同一分区,并为分区中的这些事件维护顺序。
您对处理方的数据有这样的要求吗?
如果您没有此类要求,则建议不要设置PartitionKey&#34;。这种方式事件中心代理将统一分配事件。
如果您确实对PartitionKey中的数据有订单保证要求,并且您的发布者数量较少,那么可以通过手动方式处理分区并使用分区发件人分配负载。
有关如何使用分区发件人的信息,请参阅此链接。
http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.createpartitionedsender.aspx