异步读取事件间歇性地得到 EventHubs 异常(消费者断开连接)
ReadEventsAsync got EventHubsExeception(ConsumerDisconnected) intermitently
我正在使用 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 link 并请求事件中心服务提供它独占访问。这会导致事件中心服务终止您的 link,AMQP 错误代码 Stolen
,事件中心 SDK 将其转换为您所看到的形式。 (source)
这些独占访问请求是在消费者组级别强制执行的。在您的代码段中,您使用的是默认消费者组,其他消费者显然也使用它。作为最佳实践,我建议您为每个从事件中心读取的应用程序创建一个唯一的使用者组 - 除非您特别希望它们进行交互。
在您的情况下,您的客户并未请求独占访问权限,因此请求的任何人都将享有优先权。如果您要创建一个新的消费者组并使用它来配置您的客户端,我希望您的断开连接错误会停止。
我正在使用 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 link 并请求事件中心服务提供它独占访问。这会导致事件中心服务终止您的 link,AMQP 错误代码 Stolen
,事件中心 SDK 将其转换为您所看到的形式。 (source)
这些独占访问请求是在消费者组级别强制执行的。在您的代码段中,您使用的是默认消费者组,其他消费者显然也使用它。作为最佳实践,我建议您为每个从事件中心读取的应用程序创建一个唯一的使用者组 - 除非您特别希望它们进行交互。
在您的情况下,您的客户并未请求独占访问权限,因此请求的任何人都将享有优先权。如果您要创建一个新的消费者组并使用它来配置您的客户端,我希望您的断开连接错误会停止。