Azure 事件中心更改分区键

Azure Event Hubs Changing Partition Key

应用程序在启动时将 EventData.PartitionKey 的值设置为新的 Guid。因此,对于每个新部署,分区键都会发生变化。

我了解事件中心利用哈希机制将消息路由到特定分区。重新生成分区键是否会以任何有害的方式阻碍或影响此机制?

我不时注意到,在多次部署后,消息不会出现在事件中心(无论经过多长时间),尽管底层 EventHubClient.SendBatchAsync 方法不会抛出 Exception。该行为似乎可以任意纠正。

影响将是:每次您的应用程序重新启动时 - 消息可能会落入完全不同的分区 - 因为新的 Guid 可能会散列到不同的 EventHub 分区。

这不会以任何方式损害 EventHub 的性能。您可以根据需要生成任意数量的 PartitionKey。

但是,使用这些事件的应用程序会受到影响:通常会有一个工作人员从单个分区中处理事件(EventHubs 分区是事件的规模单位-处理器处理来自 EventHubs 的事件)。当您的应用程序以 Guid1 启动时 - 它可能被散列到由 ProcessorInstance1 处理的 Partition1,但是,当应用程序重新启动时 - 它会生成 Guid2,它可能被散列到由 ProcessorInstance10 处理的 Partition10。使用 PartitionKey 的任何应用程序背后的原则是 相关性 - 所有使用相同 PartitionKeyEventData 都将落在相同的 EventHub 分区上。但是,此密钥正在重置 - 这违背了整个目的。

所有 SendBatch 如果操作不成功,操作将抛出。这是基本保证和不可能的 SLA 违规 - 如果它不抛出。我相信,根据您解释的症状,在应用程序部署之后,由于新的 Guid 将导致事件登陆不同的分区 - 您可能正在接收来自特定分区的事件并且可能会丢失以查看它们并且它可以自动更正如果您生成另一个映射到旧分区的 Guid...我强烈建议将 partitionKey 的映射修复为 randomGuid。

more on Event Hubs...