ReadEventsAsync 间歇性地得到 EventHubsException(ConsumerDisconnected)

问题描述

我使用 EventHubConsumerClient.ReadEventsAsync 方法读取 eventHub 中的事件。当我使用认的 eventHub 时,它工作得很好。但是,当我将其路由到新的 eventHub 时,我会不时收到 EventHubsExeception(Consumerdisconnected)。从文档中。它说这是由于 A client was forcefully disconnected from an Event Hub instance. This typically occurs when another consumer with higher OwnerLevel asserts ownership over the partition and consumer group. 我几乎每次都遇到这个异常。只有几次它有效。有谁知道如何解决这个问题?或者有没有更好的方法从 eventHub 读取消息?我不想使用 eventProcessorClient 因为它需要 blobContainerClient

对于代码,我遵循了示例

await using var consumerClient = new EventHubConsumerClient(
                    EventHubConsumerClient.DefaultConsumerGroupName,eventHubConnectionString,eventHubName
                    );

await foreach (PartitionEvent partitionEvent in consumerClient.ReadEventsAsync(cancelToken)){
...
}

解决方法

您看到的错误非常特定于单个场景:另一个客户端打开了一个指向您正在读取的分区之一的 AMQP 链接,并请求事件中心服务授予它独占访问权限。这会导致事件中心服务终止您的链接,并带有 Stolen 的 AMQP 错误代码,事件中心 SDK 会将其转换为您所看到的形式。 (source)

这些独占访问请求在消费者组级别强制执行。在您的代码段中,您使用的是默认消费者组,其他消费者显然也使用了该组。作为最佳实践,我建议您为每个从事件中心读取的应用程序创建一个唯一的使用者组 - 除非您特别希望它们进行交互。

在您的情况下,您的客户没有请求独占访问权限,因此任何人都将优先。如果您要创建一个新的消费者组并使用它来配置您的客户端,我希望您的断开连接错误会停止。