【问题标题】:Azure Functions Event hub read write latency spikes with StorageException and SocketException spikesAzure Functions 事件中心读写延迟峰值与 StorageException 和 SocketException 峰值
【发布时间】:2020-11-03 14:26:04
【问题描述】:

我们的生产服务正在遭受延迟高峰的困扰。在这些峰值期间,我们看到我们收到了大量的 StorageExceptions 和 SocketExceptions

这些图像超过 4 小时。

更重要的是,这只发生在我们的 EUS 服务实例(它有大约 26 个事件中心触发器)上,而不发生在我们的 WEU(7 个事件中心触发器)和 Canary(EUS2 - 2 个事件中心触发器)上。

我们看到的存储帐户异常的最内部错误是: 指定了租约 ID,但 blob 的租约已过期。 众所周知,少量是可以的 - 但 4 小时内 24.5K 感觉不像是少量,并且异常峰值和延迟峰值之间存在直接相关性

套接字最里面的例外是: 试图以访问权限禁止的方式访问套接字。 它还与延迟峰值有很好的相关性。

另一方面,在整个 4 小时的时间段内,可以看到事件流经服务并流向接收事件中心:

所有传出事件都写入每个云中的同一个事件中心(总共 3 个 - 1 个 EUS、1EUS2、1WEU),每个云相应地写入自己的事件中心。 似乎整个延迟峰值也是由于对 eventthub 的写入操作(通过 eventthub 名称 + FQDN AAD 连接完成):

非常感谢您对此问题的任何帮助!

【问题讨论】:

  • 关于租赁问题;避免跨区域使用相同的 eventthub 名称。我看到客户由于名称相同而错误地配置了他们的消费者。关于超时,存储帐户是否与函数应用位于同一区域?
  • 嗨@SerkantKaraca,感谢您的意见!我们从不同的事件中心命名空间中读取,具体取决于它们所在的区域,但写入每个云的相同事件中心命名空间。我们正在编写的云级 eventthub 命名空间也有不同的名称。原始消息中可能没有明确这一点 - 所有事件中心都是唯一命名的。至于第二部分 - StorageAccount、AzureFunction 和 EventHubNamespace(我们正在写入)都位于同一个区域和同一个资源组中。
  • 您能否确保接收器事件中心命名空间已分配足够的 TU 来处理写入?还有,你怎么写信给EH?您是在代码中使用输出绑定还是创建 EH 客户端?
  • @SerkantKaraca,默认 TU 设置为 1,但我将自动充气设置为 20(这是最大值)。我们正在使用 AAD(EH 名称 + FQDN)样式连接在代码中创建 EventHubProducerClient。创建的 EventHubProducerClient 设置在单例静态上下文中。
  • 我将默认 TU 更改为 20 只是为了查看它是否是由于自动膨胀反应时间造成的,但我仍然得到相同的延迟峰值(以及相同的异常峰值)

标签: c# azure-functions azureservicebus azure-eventhub


【解决方案1】:

我们解决了这个问题 - Azure 功能是在消费计划上设置的 - 这样设置它,所以只有一个实例可用。要增加到多个实例,我需要将计划从消费更改为高级。

除此之外,我发现该函数在启动时会为所有触发器创建与所有 Eventhub 的连接 - 在本例中为 26 个 Eventthub。 每个 Eventhub 有 32 个分区,因此每个 Eventhub 有 32 个连接。

消费计划中的 Azure 函数有 600 个连接的硬性限制。

这意味着一旦建立连接,它最终会达到 600 个限制,进入不健康状态并重新启动自身,这反过来又会由于启动和处理来自集线器的积压事件而产生延迟峰值。

从消费升级到高级允许更高的连接限制并添加一个额外的实例(将运行的最小实例从 1 个增加到 2 个),这会拆分实例之间打开的连接,因此我们没有达到下限。

希望这可以帮助其他人坚持这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 2019-09-08
    • 1970-01-01
    • 2019-02-14
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多