什么会导致队列触发延迟?

问题描述 投票:0回答:1

我们有几个 .NET Core Azure 隔离函数:

其中一个由每 30 秒计时一次的计时器触发。它检查是否有新内容,如果有,则将新消息发送到队列。另一种是使用前面提到的队列的队列触发器。

队列触发器运行的代码还会更新一个表以跟踪它正在处理此新内容,从而防止计时器函数为相同内容添加新消息。

最近经常出现这样的情况:计时器运行并向队列添加一条消息,但队列触发器直到 30 秒后将重复消息添加到队列时才触发,此时两条消息都会触发队列功能。这会导致它们由于并发操作而失败。就在最近,在触发器同时触发所有三个消息之前,它达到了三个重复消息。

我们将对代码进行更改,以更好地应对这种可能性;然而,这个设置已经在几个项目中运行了几年,我们以前从未遇到过这个问题。

将消息发送到队列时没有提供超时可见性(我认为这意味着它默认为 0 超时)。

该应用程序位于美国东部,队列的存储帐户的主要位置是美国东部,次要位置是美国西部,因此如果使用次要位置,可能会偶尔出现延迟问题?但这并不能解释为什么当添加第二个(或第三个)时它会立即触发。这是一个间歇性问题,因此不确定是否存在由于 Azure 资源的共享性质而导致的任何延迟?

预期的行为是计时器函数向队列添加一条消息,并且队列触发器在合理的延迟(几秒钟)内触发,但最好是“立即”。如果计时器函数仍在处理,则正在处理的消息将阻止在 30 秒后再次运行时添加另一条消息。

再次,将实施一些代码更改来处理潜在的重复消息,我们需要解决的问题是为什么队列消息有时会延迟 30-60 秒(或直到另一条消息添加到队列中)。

Azure 资源的设置没有任何变化,这表明队列消息的处理会减少。

azure .net-core azure-functions azure-sdk azure-functions-isolated
1个回答
0
投票

这样说真的很难。它确实可能与 Azure 基础设施、配置或特定托管环境有关。但您还说您正在使用弹性高级计划,因此与消费计划相比,“冷启动”效应应该最小化。

不确定您的负载是什么,但Elastic Premium功能至少使一个实例保持温暖,但如果存在高负载或间歇性负载,Azure可能仍需要分配额外的资源或“唤醒”实例,从而导致延迟。

我可以建议进行一些检查-

  1. 希望您的始终开启功能已启用并且扩展配置足够好。
  2. 由于您的函数应用和存储帐户均位于美国东部,请考虑切换到 LRS 以限制异地复制导致的潜在延迟。
  3. 由于此问题是间歇性的,因此设置详细的诊断可以帮助在问题确实发生时捕获见解。 例如,借助 azure 监视器和功能应用日志,您可以捕获存储队列的详细指标,例如
    MessageCount
    Latency
    以及消息添加到队列的时间和时间的确切时间戳它们已被处理。

由于您的函数有时会因延迟而处理重复消息,因此在代码中实施重复数据删除策略可以防止重复处理。看看这个参考线程是否有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.