如果使用EventHub.SendAsync(EventData),有没有办法找出写入消息的分区?

Is there a way to find out which partition is the message written if using EventHub.SendAsync(EventData)?

如果使用来自 Azure EventHub 客户端 SDK 的 EventHub.SendAsync(EventData),是否有办法找出写入消息的分区?

我们有意不提供分区键,以便 EventHub 服务可以进行内部负载平衡,但希望找出数据最终写入哪个分区,以诊断端到端数据流的问题。

没有直接的方法。但是有 2 个解决方法。

1.Use Event Hubs Capture 来存储传入的事件,然后在指定的 blob 存储中检查事件。当事件存储在blob存储中时,路径包含分区id,所以你可以知道。

2.Use 代码。新建一个Consumer Group,按照this article to read events. And in this section,有个方法public Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)。您可以使用参数 PartitionContext 来获取事件的分区 ID(通过使用 context.PartitionId)。

Ivan 的答案在旧版 SDK (Microsoft.Azure.EventHubs) 的上下文中是正确的,但当前一代 (Azure.Messaging.EventHubs) 略有不同。您没有提到特定的语言,但从概念上讲,答案在它们之间是相同的。我将使用 .NET 来说明。

如果您在读取事件时不使用需要直接指定分区的调用,那么您将始终可以访问表示从中读取事件的分区的对象。例如,如果您使用 EventHubConsumerClient method ReadEventsAsync to explore, you'll be see the PartitionEvent,其中 Partition 属性 告诉您从中读取 Data 的分区。

当使用 EventProcessorClient, your ProcessEventAsync handler will be invoked with a set of ProcessEventArgs 时,Partition 属性 告诉您 Data 是从哪个分区读取的。