用于java eventhubs的azure sdk分区已丢失



我们最近通过以下azure文档部署了azure事件中心java接收器/侦听器客户端。

我确实相信数组以0开头,但这与这个问题无关。所以不管怎样,我观察到processError&也是processPartitionClose

Error occurred in partition14 - connectionId[MF_5fba9c_1636350888640] sessionName[eventhub-name/ConsumerGroups/consumer-group-name/Partitions/14] entityPath[eventhub-name/ConsumerGroups/consumer-group-name/Partitions/14] linkName[14_500701_1636350888641] Cannot create receive link from a closed session., errorContext[NAMESPACE: namespace.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: eventhub-name/ConsumerGroups/consumer-group-name/Partitions/14]
ERROR  | Partition has been lost 14 reason LOST_PARTITION_OWNERSHIP

问题:

  1. azure sdk for java sdk eventhubs是否在自动丢失的分区上重新连接
  2. 如果不是,那么手动重新启动之前的最佳做法是什么?
    • 我需要手动更新检查点吗
    • 我需要对所有权做些什么吗

这是我们使用示例代码的sdk设置

EventProcessorClientBuilder eventProcessorClientBuilder = new EventProcessorClientBuilder()
.checkpointStore(new BlobCheckpointStore(blobContainerAsyncClient))
.connectionString(getEventHubConnectionString(), getEventHubName())
.consumerGroup(getConsumerGroup())
.initialPartitionEventPosition(initialPartitionEventPosition)
.processEvent(PARTITION_PROCESSOR)
.processError(ERROR_HANDLER)
.processPartitionClose(CLOSE_HANDLER);
EventProcessorClient eventProcessorClient = eventProcessorClientBuilder.buildEventProcessorClient();
// Starts the event processor
eventProcessorClient.start();
private final Consumer < ErrorContext > ERROR_HANDLER = errorContext->{
log.error("Error occurred in partition" + errorContext.getPartitionContext().getPartitionId()
+ " - " + errorContext.getThrowable().getMessage());
};
private final Consumer < CloseContext > CLOSE_HANDLER = closeContext->{
log.error("Partition has been lost " + closeContext.getPartitionContext().getPartitionId()
+ " reason " + closeContext.getCloseReason());
EventContext lastContext = lastEvent.get();
if (lastContext != null && (lastContext.getEventData().getSequenceNumber() % 10) != 0) {
lastContext.updateCheckpoint();
}
};
jdk : 1.8
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-eventhubs-checkpointstore-blob</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-eventhubs</artifactId>
<version>5.10.1</version>
</dependency>

我确实遇到了github-issue-15164,但在提到的任何地方都找不到它。

azure sdk for java sdk eventhubs是否在自动丢失的分区上重新连接?

是的,azure-messaging-eventhubs库中的EventProcessorClient将在这些分区上重新连接。您不需要手动更改任何内容。

如果有多个EventProcessorClient实例正在运行,并且它们都处理来自同一事件中心的事件并使用同一使用者组,则您会在一个处理器上看到此LOST_PARTITION_OWNERSHIP错误,因为分区的所有权可能已由另一个处理器声明。检查点是从检查点存储(上面代码示例中的存储Blob(中读取的,处理从下一个序列号开始恢复。

请参阅分区所有权和检查点以了解更多详细信息。

最新更新