C# Azure';s EventData.PartitionKey决定写入哪个分区?

C# Azure';s EventData.PartitionKey决定写入哪个分区?,c#,azure,C#,Azure,我正在尝试在Azure中实现一个事件中心。我已经成功地创建了一个生产者,将消息发布到事件中心,以及一个消费者,用于读取消息。我的事件中心分为16个分区。在消费者方面,我按如下方式循环介绍了其中的每一项: var eventHub = NamespaceManager.CreateFromConnectionString(builder.ToString()).GetEventHub("de-analytics-events"); foreach (var partitionId in even

我正在尝试在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);
}
var eventHub=NamespaceManager.CreateFromConnectionString(builder.ToString()).GetEventHub(“反分析事件”);
foreach(eventHub.partitionId中的var partitionId)
{
subscriberGroup.RegisterProcessor(新租约)
{
PartitionId=PartitionId
},新事件处理器或检查点管理器());
Console.WriteLine(“处理:+partitionId”);
}
在调试器中查看这些值表明,对于16个分区,eventHub.partitionId的范围从“0”到“15”

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

阅读表明其中涉及某种散列,但我并不特别想随机猜测散列到数字0-15的16个字符串。所以我想知道如何定义发布到哪个分区


作为补充参考,这是我为使我的最简单的案例生效而遵循的教程。

没错,哈希用于将分区键转换为给定分区。那么,我的问题是,只要哈希算法均匀一致地分布事件,为什么您真的要关心消息分配给哪个分区呢

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


更大的挑战是确保您使用的分区密钥策略有助于确保事件在分区之间的分布相当均匀(也就是说,不要给10000个设备所有相同的分区密钥)

指定PartitionKey将确保具有相同密钥的所有事件都发送到相同的分区,并且分区内的这些事件的顺序保持不变

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

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

如果您的数据在PartitionKey中具有订单保证要求,并且您有少量发布者,则可以使用分区发送者手动处理分区和分配负载。
有关如何使用分区发件人的信息,请参阅此链接。

Hmm这更像是一种关注点分布的方法。也许我还没有完全理解事件中心(毫不奇怪,文档仍然非常稀少)。对于写入分区的设备数量很大的情况,哈希平均分配负载。但我只期望分区发布器的数量是它的2到3倍。我想它足够强大,可以处理越来越多的出版商,我只是想知道是否有一种方法可以手动处理这个过程,因为我只处理一小部分出版商一个补充说明,我使用的上述方法是非常手动的,并不特别健壮……我的问题中的教程中提到的
EventProcessorHost
是监听所有分区的更好方法如果您谈论的是数量有限的发布者,我是否可以建议您查看分区队列?通过启用分区,若您正确地处理put和get(也称为异步调用是必需的),您将在单个队列上增加16倍的吞吐量。我编写了一个非常原始的整个分区处理的克隆,类似于事件集线器和Kafka,称为NPartition。它在github上。