问题详情

使用EPH获取Event Hub数据时,多次出现连接shutdown和LeaseLost的error  ,截取某一次的error log如:

Time:2021-03-10 08:43:48.4650|NE:VSDN|Machine:RD0003FF01A8BE|Lv:INFO|ActivityId:|Msg:CdmEventProcessor Shutting Down. Partition '29', Reason: 'LeaseLost'.

Time:2021-03-10 08:43:48.4650|NE:VSDN|Machine:RD0003FF01A8BE|Lv:INFO|ActivityId:|Msg:CdmEventProcessor Shutting Down. Partition '26', Reason: 'LeaseLost'.

Time:2021-03-10 08:43:48.4650|NE:VSDN|Machine:RD0003FF01A8BE|Lv:INFO|ActivityId:|Msg:CdmEventProcessor Shutting Down. Partition '1', Reason: 'LeaseLost'.

Time:2021-03-10 08:43:48.4650|NE:VSDN|Machine:RD0003FF01A8BE|Lv:INFO|ActivityId:|Msg:CdmEventProcessor Shutting Down. Partition '22', Reason: 'LeaseLost'.

Time:2021-03-10 08:43:48.4650|NE:VSDN|Machine:RD0003FF01A8BE|Lv:INFO|ActivityId:|Msg:CdmEventProcessor Shutting Down. Partition '8', Reason: 'LeaseLost'.

Time:2021-03-10 08:43:48.4650|NE:VSDN|Machine:RD0003FF01A8BE|Lv:INFO|ActivityId:|Msg:CdmEventProcessor Shutting Down. Partition '9', Reason: 'LeaseLost'.

Time:2021-03-10 08:43:48.4650|NE:VSDN|Machine:RD0003FF01A8BE|Lv:INFO|ActivityId:|Msg:CdmEventProcessor Shutting Down. Partition '7', Reason: 'LeaseLost'.

Time:2021-03-10 08:43:48.4650|NE:VSDN|Machine:RD0003FF01A8BE|Lv:INFO|ActivityId:|Msg:CdmEventProcessor Shutting Down. Partition '31', Reason: 'LeaseLost'.

Time:2021-03-10 08:43:48.4650|NE:VSDN|Machine:RD0003FF01A8BE|Lv:INFO|ActivityId:|Msg:CdmEventProcessor Shutting Down. Partition '17', Reason: 'LeaseLost'

....

如何解释EPH的Shutting Down呢?为什么出现LeaseLost(租约丢失)情况呢?

问题解释

在Azure SDK Microsoft.Azure.EventHubs.Processor 的解释中列举出LeaseLost是The lease was lost or transitioned to a new processor instance,表示当前租约丢失,或者转移到一个新的Processor实例上。

这是因为Event Hub可以设置多个分区,同时也可以通过多个消费端来消费分区中的数据,但是多少个客户端是最好的呢?根据【Azure 事件中心的 .NET 编程指南】中对EPH(Event Processor Host)的介绍,客户端主机将尝试使用“贪婪”算法获取事件中心内每个分区上的租约,如果当前只有一个消费端连接Event Hub,则当前消费端会把所有分区的租约都获取过去。当有2个或者多个消费端时,它们会自动在多个消费端中进行负载均衡,最终达到动态平衡

  • 只有一个消费端时(Azure Worker Role 1),8个分区都与它建立租约。
  • 当有第二个消费端时(Azure Worker Role 2), EPH就自动动态平衡分区数,最终表现为各自处理4个分区数据。
  • 而原来与Worker Role 1相连的5,6,7,8分区就会出现shutdown,原因时leaselost的日志记录。

所以,我们观察到的Shutdown LeaseLost日志消息就是因为EPH在自动进行多个实例间分区数的动态平衡而产生的。这是完全正常的现象。

以上EPH出现LeaseLost的详细分解可见原文地址:https://stackoverflow.com/questions/41496754/what-is-causing-azure-event-hubs-receiverdisconnectedexception-leaselostexceptio/41867611#41867611

TLDR: This behavior is absolutely normal.

Why can't Lease Management be smooth & exception-free: To give more control on the situation to developer.

The really long story - all-the-way from Basics EventProcessorhost (hereby EPH - is very similar to what __consumer_offset topic does for Kafka Consumers - partition ownership & checkpoint store) is written by Microsoft Azure EventHubs team themselves - to translate all of the EventHubs partition receiver Gu into a simple onReceive(Events) callback.

... ...

译文内容为:

TLDR: This behavior is absolutely normal. 这是正常的行为

为什么不能让Event Hub分区租约的管理不出现异常呢?这是为了更好地让开发者来控制租约到期(Lease Lost)的情况。

这需要从EventProcessorHost(简称 EPH)从创建之时说起, EPH是由Microsoft Azure EventHubs团队开发,用来把所有的EventHubs partition receiver事件转换为一个简单的回调事件 onReceive。这样的目的是为了解决在读取高吞吐量分区数据流的情况下的2个主要的,众所周知的问题

1)容错接收管道 (Fault tolerant receive pipe-line) - 如果运行PartitionReceiver的Host 宕机后恢复正常,则它需要从其宕机的地方继续进行处理。 为了记住上一次成功处理的EventData,EPH使用提供给EPH构造函数的Blob来存储检查点(Checkpoints -调用context.CheckpointAsync()时)。 所以,当Host进程终止时(例如:突然重新启动或遇到硬件故障,再也无法恢复),任何EPH实例都可以执行此任务并从该Checkpoint恢复。

2)在EPH实例之间动态分配分区 (Balance/distribute partitions across EPH instances假设有10个分区和2个EPH实例处理来自这10个分区的事件 - 需要一种在实例之间划分分区的方法(PartitionManager组件)。 使用Azure存储-Blob LeaseManagement功能来实现这一点。 从2.2.10版本开始 --- 简化为EPH假定所有分区均被加载。

基于以上的情况,我们来看一看EPH发生了什么,首先, 在上面的10个事件中心分区和2个EPH实例的示例中,处理其中的事件顺序如下:

一:假设第一个EPH实例(EPH1)最初是单独启动的,它为所有10个分区创建了接收器,并且开始处理事件。

在启动过程中 ---  EPH1将通过获取代表这10个事件中心分区的租约(存储Blob上)来宣布拥有所有这10个分区(EPH在存储帐户中内部创建-从StorageConnectionString中获取Blob)。但是该租约旨在指定时间内有效,有效期过后,EPH1会失去对分区的所有权

二:续订租约

通过更新Blob上的租约,EPH1会连续续订这10个分区的租约。 续订频率以及其他有用的调整可以使用PartitionManagerOptions修改

三:启动第二个EPH实例(EPH2), 并且使用与EPH1相同的StorageConnectionString。

开始时,EPH2有0个分区要处理,为了要在EPH实例之间实现分区的动态平衡,EPH2将下载租约列表(包含分区ID与拥有者的映射关系)。并会平均的截取5个分区的租约。在整个过程中,EPH2会根据所获取的分区信息得到最新的检查点(checkpoint),创建PartitionReceiver并继续接收消息

四:最后,EPH1将失去对这5个分区的所有权,并将根据其分区的实时状态而遇到不同的错误。

  • 如果EPH1正在调用PartitionReceiver.Receive时,而且EPH2在同一分区创建PartitionReceive, EPH1就会遇见ReceiverDisconnectedException。并且调用EventProcessor.Close方法,Close Reason为LeaseLost
  • 如果EPH1处于checkpointing 或renewing 租约的状态,而EPH2窃取了租约,则产生EventProcessorOptions.ExceptionReceived异常,eventHandler带有leaselostException的信号(409 conflict error)-最终也会调用IEventProcess.Close (LeaseLost)

为什么不能让Event Hub分区租约的管理不出现异常呢?(Why can't Lease Management be smooth & exception-free)

为了使消费端简单和无错误,EPH可以吞下与租约相关的异常,而不通过用户代码的方式通知。 但是,我们意识到,抛出LeaseLostException可能使客户能够在IEventProcessor.ProcessEvents()回调中找到问题的根源 --- 可能是频繁进行分区移动造成

  • 当消费端实例(EPH)发生轻微的网络抖动, 使得EPH无法续订租约而重启。如果这个实例的网络一直处于抖动情况,EPH将来来回回获取Partitions信息,同时不断的尝试从其他EPH中窃取租约。这将导致消费端无法处理正常的Event Hub事件。当发生这样的情况时,可以在日志中可见ReceiverDisconnectedException异常,这一点可以非常好的帮助开发者定位问题。
  • 或是在ProcessEvents的逻辑代码中出现无法处理的异常,并导致整个进程被破坏,分区也会在多个EPH实例之间来回移动。
  • 也有可能是在EPH中使用的储存账户上有执行write/delete操作,与EPH实例执行的操作冲突等。
  • 也有可能是Azure的数据中心发生大范围的宕机事件(不希望这样的情况发生),分区也会在多个EPH实例之间来回移动。

在大多数情况下,对于Event Hub SDK而言,要检测以上这些异常是非常棘手的。 所以SDK团队将控制权委托给开发者,开发者通过抛出的异常来定位问题。

参考资料

CloseReason Enum:https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.eventhubs.processor.closereason?view=azure-dotnet#fields

【Azure 事件中心】EPH (EventProcessorHost) 消费端观察到多次Shutdown,LeaseLost的error信息,这是什么情况呢?的更多相关文章

  1. 【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)

    问题描述 事件中心提供 Kafka 终结点,现有的基于 Kafka 的应用程序可将该终结点用作运行你自己的 Kafka 群集的替代方案. 事件中心可与许多现有 Kafka 应用程序配合使用.在Azur ...

  2. 【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存

    问题描述 在使用Azure Event Hub的SDK时候,常规情况下,发现示例代码中并没有SDK内部的日志输出.因为在Java项目中,没有添加 SLF4J 依赖,已致于在启动时候有如下提示: SLF ...

  3. 【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心

    问题描述 在Application Gateway中,开启WAF(Web application firewall)后,现在需要把访问的日志输出到第三方分析代码中进行分析,如何来获取WAF的诊断日志呢 ...

  4. 【Azure 事件中心】Azure Event Hub 新功能尝试 -- 异地灾难恢复 (Geo-Disaster Recovery)

    问题描述 关于Event Hub(事件中心)的灾备方案,大多数就是新建另外一个备用的Event Hub,当主Event Hub出现不可用的情况时,就需要切换到备Event Hub上. 而在切换的过程中 ...

  5. 【Azure 事件中心】使用Azure AD认证方式创建Event Hub Consume Client + 自定义Event Position

    问题描述 当使用SDK连接到Azure Event Hub时,最常规的方式为使用连接字符串.这种做法参考官网文档就可成功完成代码:https://docs.azure.cn/zh-cn/event-h ...

  6. 【Azure 事件中心】Event Hub 无法连接,出现 Did not observe any item or terminal signal within 60000ms in 'flatMapMany' 的错误消息

    问题描述 使用Java SDK连接Azure Event Hub,一直出现 java.util.concurrent.TimeoutException 异常, 消息为:java.util.concur ...

  7. 【Azure 事件中心】在Service Bus Explorer工具种查看到EventHub数据在分区中的各种属性问题

    问题描述 通过Service Bus Explorer工具,查看到Event Hub的属性值,从而产生的问题及讨论: Size in Bytes:   这个是表示当前分区可以存储的最大字节数吗? La ...

  8. 【Azure 事件中心】azure-spring-cloud-stream-binder-eventhubs客户端组件问题, 实践消息非顺序可达

    问题描述 查阅了Azure的官方文档( 将事件发送到特定分区: https://docs.azure.cn/zh-cn/event-hubs/event-hubs-availability-and-c ...

  9. Azure 进阶攻略 | 关于Java 和事件中心的那不得不说的事

    物联网技术辣么火,虽然之前有说过不少,但今天,仍有一个憋在我心里已久,不得不说的话题:基于Azure 的物联网平台必不可少,你可能已经在使用,但也许并没有意识到的服务:Azure 事件中心. 啊?事件 ...

随机推荐

  1. user tracker with ETag

    user tracker with ETag 用户追踪, without cookies clear cache bug 实现原理 HTTP cache hidden iframe 1px image ...

  2. js 获取是否为闰年,以及各月的天数 & isLeapYear

    js 获取是否为闰年,以及各月的天数 calendar utils isLeapYear const isLeapYear = (year) => { return (year % 4 === ...

  3. taro 渲染 html

    taro 渲染 html https://taro-docs.jd.com/taro/next/docs/next/html.html // Taro 更推荐使用框架自带的渲染 HTML 方式 // ...

  4. html->pdf直接下载

    import html2Canvas from 'html2canvas' import JsPDF from 'jspdf' export default{ install (Vue, option ...

  5. js 反应&行动

    反应 class Reaction { _page = 1; get page() { return this._page; } set page(newValue) { this._page = n ...

  6. .NET 6 Preview 1 发布

    前言 2021 年 2 月 17 日微软发布了 .NET 6 的 Preview 1 版本,那么来看看都有什么新特性和改进吧,由于内容太多了因此只介绍一些较为重点的项目. 统一和扩展 .NET 6 在 ...

  7. SpringBoot进阶教程(七十一)详解Prometheus+Grafana

    随着容器技术的迅速发展,Kubernetes已然成为大家追捧的容器集群管理系统.Prometheus作为生态圈Cloud Native Computing Foundation(简称:CNCF)中的重 ...

  8. AtCoder Beginner Contest 192 F - Potion

    题目链接 点我跳转 题目大意 给定 \(N\) 个物品和一个 \(X\) ,第 \(i\) 个物品的重量为 \(ai\),你可以从中选择任意个物品(不能不选) 假定选择了 \(S\) 个物品,物品的总 ...

  9. 1071 Speech Patterns——PAT甲级真题

    1071 Speech Patterns People often have a preference among synonyms of the same word. For example, so ...

  10. nacos集群

    本章分析一下nacos集群之间nacos服务器上线,下线原理 每5秒运行定时任务ServerListManager.ServerListUpdater获取新上线的节点或下线的节点 每2秒运行定时任务S ...