Azure EventHub和功能LeaseLostException

m1n*_*keh 1 azure-eventhub azure-functions

关于我们反复看到的以下异常,请在我们的消费计划功能应用程序上看到异常奇怪的行为:

  • Microsoft.Azure.EventHubs.RecieverDisconnectedException (已创建新的具有较高纪元“ 2”的接收器,因此当前具有纪元“ 1”的接收器已断开连接。)
  • System.Net.WebException (引发了类型为“ Microsoft.ServiceBus.Messaging.LeaseLostException”的异常。)

只要我们强调功能,即在短时间内从0到50,000个事件发生,我们就会得到这些异常,但是它们与匹配我们的Function App。的cloud_role挂钩。这会让我相信这是一个主机错误。

阅读各种文档,例如(https://docs.microsoft.com/zh-cn/azure/event-hubs/event-hubs-features),我我知道EventHub接收器是如何工作的[但老实说,我是在行之间进行读取(目前还不清楚),因为我的一个接收者依赖于一个消费者组来管理从EventHub分区(我使用的是32个)中读取一批消息。

我的假设是,在负载下,单个消费者组的功能实例太多,无法“应付”,它只是反复地切换分区的租用...但是,在我的测试场景中,我删除了所有逻辑除了在事件中心之间中继消息外,其他功能还起作用,并且即使在EventHub上只有4个分区,错误仍然存​​在

为了拼命地查看是否在更高版本中得到解决,我在功能v2中模拟了完全相同的功能,并获得了与.net核心等效的功能。

  1. Microsoft.Azure.EventHubs.RecieverDisconnectedException (已创建新的具有较高纪元“ 2”的接收器,因此当前具有纪元“ 1”的接收器已断开连接。)
  2. Microsoft.WindowsAzure.Storage.StorageException (指定的租约ID与Blob的租约ID不匹配。)
  3. System.ArgumentOutOfRangeException (因为..而忽略了偏移量为1184072 /序列号为1038的过时检查点。)

所以有人可以吗

  • 解释这到底是真正的幕后事
  • 如果它们不是实际的“真实”错误,并且它们只是管理事情的主人,请帮助我抑制它们。

这些异常真的很烦人,因为要真正看到真正的未处理异常非常棘手。

Lin*_*Toh 5

这些是虚假的错误,是由于功能动态扩展/扩展功能驻留在Function App(主机进程)中而导致的,您可以忽略它们。

可以理解的是,它们出现在您的日志中的事实令人震惊,我们已经开始着手抑制某些错误(请参阅https://github.com/Azure/azure-webjobs-sdk/issues/1760)。该版本与v1.0.11913版本一起发布,您应该将其视为警告。如果他们仍然显示为错误,请提出问题


为什么您会看到这些异常的其他背景

让我们从一些关于EventHub缩放如何工作的初步知识开始,如这篇文章所述:https ://stackoverflow.com/a/42911842/6465830

1. Microsoft.ServiceBus.Messaging.LeaseLostException

每次成功执行横向扩展操作时,EventHub都会在成功管理分区的租约的(1..N)组中重新分配分区租约EventProcessorHosts,其中N是分区数为您的EventHub。例如,如果您仅从Function_0开始,并且它设法在所有10个分区上都至少占有一席之地,那么当我们扩展到Function_1且EventHub决定在两个Function之间平均分配消息时,Function_0将失去对5个分区的租约。此行为说明了Exception of type 'Microsoft.ServiceBus.Messaging.LeaseLostException' was thrown您所看到的。

2. Microsoft.Azure.EventHubs.ReceiverDisconnectedException

此外,Azure函数还将横向扩展到> N实例,因此将有一组N + 1 ... M,其中M是横向扩展实例的总数,而不是能够在任何分区上获得租约。这样做的副作用是,总会有EPH随时准备迅速获取丢失的租约以保持管道畅通。这解释了New receiver with higher epoch of '2' is created hence current receiver with epoch '1' is getting disconnected.您所看到的。同样,仅在执行功能时向您收费,因此此处存在一些超额配置的事实不会影响您的账单。