逻辑应用程序:具有并发控制的 ServiceBus 触发器会导致窥视锁定超时

Logic Apps: ServiceBus trigger with concurrency control causes peek-lock timeouts

几天后,在逻辑应用程序中结合使用 ServiceBus 触发器和 "Concurrency control" 功能时,我看到了一些 "new" 行为。 我有一个轮询触发器,每 5 分钟检查一次队列。并将并发控制配置为最多 5 个实例,以免使我的后端数据库过载。

过去,当我将 40 条消息放入队列时,它会启动 5 个实例。当轮询间隔已过时,仍然有 3 个实例 运行...触发器然后启动 2更多实例,使总 运行 个实例恢复到我配置的阈值 5。我是一个满意的客户:)

现在我看到触发器立即创建了 40 个实例。其中 5 人 运行,另外 35 人处于 "waiting" 状态。当一个实例完成处理时,其中一个等待实例开始工作。听起来不错,你不觉得吗?并非在所有情况下..

当使用 Peek-lock 机制时,超时会在 "waiting" 实例启动时开始计算。如果等待时间超过 5 分钟(锁定超时最大值),则锁定已过期。这会导致消息在队列中再次可用,从而导致为同一消息启动新的 "waiting" 实例。 所以最后,我得到了很多不必要的重复处理,甚至消息因为达到了 maxDeliveryCount 限制而被死信。

似乎无法找到有关此轮询行为更改的任何信息? 除了使用自动完成功能之外,还有人知道 Peek-lock 问题的解决方法吗?

2018 年 7 月 8 日更新:

MSFT Logic App 产品团队确认这是为 SplitOn 触发器启用并发控制的新实现。在您的逻辑应用程序上启用 SplitOn 后,您将获得此行为。即使当您再次禁用 SplitOn 时,行为也会保持原样。对于 "reset" 您的逻辑应用程序,您必须完全删除资源并重新部署它。

这听起来像是一个真正的问题。由于锁定持续时间的最大值为 5 分钟,您别无选择,只能使用自动完成。

我的建议是让主题包含两个订阅或一个重复队列。

主题订阅 - 消息将发送到两个订阅,您可以在其中使用一个订阅用于逻辑应用程序自动完成,另一个订阅用于跟踪消息。由于两个订阅将具有相同的消息,因此不会有任何重复或丢失的消息。

重复队列 - 您可以让逻辑应用程序自动完成消息并将其转发到第二个队列,您可以在其中跟踪消息。

MSFT Logic App 产品团队确认这是为 SplitOn 触发器启用并发控制的新实现。在您的逻辑应用程序上启用 SplitOn 后,您将获得这种新行为。即使当您再次禁用 SplitOn 时,行为也会保持原样。 对于 "reset" 您的逻辑应用程序,您必须完全删除资源并重新部署它。

如果 "waiting runs" 实现适合您的场景,但您仍希望控制每个触发器 started/waiting 的实例数 运行, 有可用于控制最大“waitingRuns” 的设置。不幸的是,UI 中尚未启用此功能,因此您需要转到代码查看。 目前 maximumWaitingRuns 不能设置为低于 1。