Azure EventHub 和函数 LeaseLostException
Azure EventHub & Function LeaseLostException
我们在消费计划 Function App 上看到异常奇怪的行为,请注意以下我们反复看到的异常:
Microsoft.Azure.EventHubs.RecieverDisconnectedException
(创建了具有更高纪元“2”的新接收器,因此具有纪元“1”的当前接收器正在断开连接。)
System.Net.WebException
(抛出类型 'Microsoft.ServiceBus.Messaging.LeaseLostException' 的异常。)
每当我们强调功能时,我们都会遇到这些异常,即在瞬间从 0 到 50,000 个事件,但它们与匹配我们的功能应用程序的 cloud_role 挂钩。这让我相信这是主机错误..
阅读各种 doco,即 (https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-features),我 认为 我理解 EventHub 接收器是如何工作的[但老实说,我在字里行间读到还不清楚]因为我的一个接收者依赖于一个消费者组来管理从 EventHub 分区(我正在使用其中 32 个)读取的消息批次。
我的假设是,在负载下,单个消费者组的函数实例太多 'cope',它只是重复切换分区的租约...但是,在我的测试中在这种情况下,除了在事件中心之间中继消息之外,我从函数中删除了所有逻辑,即使在 EventHub
上只有 4 个分区,错误仍然存在
为了看看是否在以后的版本中得到解决,我在 Functions v2 中模拟了完全相同的功能,并收到了我认为与 .net 核心等效的东西..
Microsoft.Azure.EventHubs.RecieverDisconnectedException
(创建了具有更高纪元“2”的新接收器,因此具有纪元“1”的当前接收器正在断开连接。)
Microsoft.WindowsAzure.Storage.StorageException
(指定的租用 ID 与 blob 的租用 ID 不匹配。)
System.ArgumentOutOfRangeException
(忽略偏移量为 1184072/序列号为 1038 的过时检查点,因为...)
所以,有人可以吗
- 解释一下实际上在幕后发生的事情
- 如果它们不是实际的 'real' 错误,并且它们只是主机管理的东西,请帮助我抑制这些...
这些异常真的很烦人,因为很难真正看到真正的未处理异常。
这些是由于 Function App(主机进程)中的 Function 动态缩放 out/in 造成的虚假错误,您可以忽略它们。
可以理解,它们出现在您的日志中这一事实令人担忧,我们已经开始了一些工作来抑制某些错误(如果它们仍然显示为错误,请参阅 https://github.com/Azure/azure-webjobs-sdk/issues/1760). This was released with version v1.0.11913 and you should be seeing them as warnings. Kindly file an issue。
关于为什么您会看到这些异常的其他背景信息
让我们从一些关于 EventHub 缩放如何工作的初步知识开始,如本post所述:
1. Microsoft.ServiceBus.Messaging.LeaseLostException
每次扩展操作成功时,EventHub 会在 (1..N) 组 EventProcessorHosts
中重新分配分区租约设法获得分区的租约,其中 N 是您的 EventHub 的分区数。例如,如果您仅从 Function_0 开始,并且当我们扩展到 Function_1 时,它设法在所有 10 个分区上获取最少 并且 EventHub 决定在两个函数之间平均分配消息,然后 Function_0 将失去对其中 5 个分区的租约。此行为解释了您所看到的 Exception of type 'Microsoft.ServiceBus.Messaging.LeaseLostException' was thrown
。
2。 Microsoft.Azure.EventHubs.ReceiverDisconnectedException
此外,Azure Functions 还横向扩展到 >N 个实例,所以会有一组 N+1.. .M,其中 M 是无法在任何分区上获得租约的横向扩展实例的总数。这样做的副作用是总会有一个 EPH 准备好快速获取丢失的租约以保持管道运行。这解释了您看到的 New receiver with higher epoch of '2' is created hence current receiver with epoch '1' is getting disconnected.
。同样,您仅在函数执行时才需要付费,因此这里存在一些超额配置这一事实不会影响您的计费。
我们在消费计划 Function App 上看到异常奇怪的行为,请注意以下我们反复看到的异常:
Microsoft.Azure.EventHubs.RecieverDisconnectedException
(创建了具有更高纪元“2”的新接收器,因此具有纪元“1”的当前接收器正在断开连接。)System.Net.WebException
(抛出类型 'Microsoft.ServiceBus.Messaging.LeaseLostException' 的异常。)
每当我们强调功能时,我们都会遇到这些异常,即在瞬间从 0 到 50,000 个事件,但它们与匹配我们的功能应用程序的 cloud_role 挂钩。这让我相信这是主机错误..
阅读各种 doco,即 (https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-features),我 认为 我理解 EventHub 接收器是如何工作的[但老实说,我在字里行间读到还不清楚]因为我的一个接收者依赖于一个消费者组来管理从 EventHub 分区(我正在使用其中 32 个)读取的消息批次。
我的假设是,在负载下,单个消费者组的函数实例太多 'cope',它只是重复切换分区的租约...但是,在我的测试中在这种情况下,除了在事件中心之间中继消息之外,我从函数中删除了所有逻辑,即使在 EventHub
上只有 4 个分区,错误仍然存在为了看看是否在以后的版本中得到解决,我在 Functions v2 中模拟了完全相同的功能,并收到了我认为与 .net 核心等效的东西..
Microsoft.Azure.EventHubs.RecieverDisconnectedException
(创建了具有更高纪元“2”的新接收器,因此具有纪元“1”的当前接收器正在断开连接。)Microsoft.WindowsAzure.Storage.StorageException
(指定的租用 ID 与 blob 的租用 ID 不匹配。)System.ArgumentOutOfRangeException
(忽略偏移量为 1184072/序列号为 1038 的过时检查点,因为...)
所以,有人可以吗
- 解释一下实际上在幕后发生的事情
- 如果它们不是实际的 'real' 错误,并且它们只是主机管理的东西,请帮助我抑制这些...
这些异常真的很烦人,因为很难真正看到真正的未处理异常。
这些是由于 Function App(主机进程)中的 Function 动态缩放 out/in 造成的虚假错误,您可以忽略它们。
可以理解,它们出现在您的日志中这一事实令人担忧,我们已经开始了一些工作来抑制某些错误(如果它们仍然显示为错误,请参阅 https://github.com/Azure/azure-webjobs-sdk/issues/1760). This was released with version v1.0.11913 and you should be seeing them as warnings. Kindly file an issue。
关于为什么您会看到这些异常的其他背景信息
让我们从一些关于 EventHub 缩放如何工作的初步知识开始,如本post所述:
1. Microsoft.ServiceBus.Messaging.LeaseLostException
每次扩展操作成功时,EventHub 会在 (1..N) 组 EventProcessorHosts
中重新分配分区租约设法获得分区的租约,其中 N 是您的 EventHub 的分区数。例如,如果您仅从 Function_0 开始,并且当我们扩展到 Function_1 时,它设法在所有 10 个分区上获取最少 并且 EventHub 决定在两个函数之间平均分配消息,然后 Function_0 将失去对其中 5 个分区的租约。此行为解释了您所看到的 Exception of type 'Microsoft.ServiceBus.Messaging.LeaseLostException' was thrown
。
2。 Microsoft.Azure.EventHubs.ReceiverDisconnectedException
此外,Azure Functions 还横向扩展到 >N 个实例,所以会有一组 N+1.. .M,其中 M 是无法在任何分区上获得租约的横向扩展实例的总数。这样做的副作用是总会有一个 EPH 准备好快速获取丢失的租约以保持管道运行。这解释了您看到的 New receiver with higher epoch of '2' is created hence current receiver with epoch '1' is getting disconnected.
。同样,您仅在函数执行时才需要付费,因此这里存在一些超额配置这一事实不会影响您的计费。