使用逻辑应用程序清理 ServiceBus 死信队列
ServiceBus Deadletter queue cleanup using Logic Apps
我们想使用 Azure 逻辑应用程序定期清理 ServiceBus 死信队列。这个想法是每天循环遍历所有 DeadLetter 消息并删除早于 x 天的消息。
我使用“从队列中获取消息(窥视锁)”实现了周期性的“重复”任务。当他们满足我的条件时,他们就完成了,因此从队列中移除。这适用于数百条消息。但是当我用数千条消息测试它时,它开始显示 return 当前 运行 期间已经访问过的消息。如果再次处理相同的 messageId,我包含一个终止处理的条件。
有没有办法实现我们想要的?因此,要遍历所有消息,删除一些消息并保留其他消息,而无需重复访问任何消息?
这里是流程的简化方案。
我认为问题在于您的 For Each 需要并发控制。 Get Messages 操作将从队列中 return X 条消息(默认情况下为 20 条),然后 For Each 操作并行运行,并且这些操作(在 For Each 内)不会等待所有操作在退出前完成那个循环,然后用 Do Until 再次循环。我会测试更改 For Each Settings/Concurrency 控件(右侧的省略号)并将并行度降低到较低的数字。
最后我们决定完全跳过逻辑应用程序。我们最终创建了二级队列,并将生命周期设置为所需值(我们希望将 DL 消息存档多长时间)。我们关闭了将过期消息发送到此辅助队列的 DL。然后我们将 DL 消息转发到这个辅助队列中。这样就不需要更多的处理,也不需要定期触发任何逻辑。
我们想使用 Azure 逻辑应用程序定期清理 ServiceBus 死信队列。这个想法是每天循环遍历所有 DeadLetter 消息并删除早于 x 天的消息。
我使用“从队列中获取消息(窥视锁)”实现了周期性的“重复”任务。当他们满足我的条件时,他们就完成了,因此从队列中移除。这适用于数百条消息。但是当我用数千条消息测试它时,它开始显示 return 当前 运行 期间已经访问过的消息。如果再次处理相同的 messageId,我包含一个终止处理的条件。
有没有办法实现我们想要的?因此,要遍历所有消息,删除一些消息并保留其他消息,而无需重复访问任何消息?
这里是流程的简化方案。
我认为问题在于您的 For Each 需要并发控制。 Get Messages 操作将从队列中 return X 条消息(默认情况下为 20 条),然后 For Each 操作并行运行,并且这些操作(在 For Each 内)不会等待所有操作在退出前完成那个循环,然后用 Do Until 再次循环。我会测试更改 For Each Settings/Concurrency 控件(右侧的省略号)并将并行度降低到较低的数字。
最后我们决定完全跳过逻辑应用程序。我们最终创建了二级队列,并将生命周期设置为所需值(我们希望将 DL 消息存档多长时间)。我们关闭了将过期消息发送到此辅助队列的 DL。然后我们将 DL 消息转发到这个辅助队列中。这样就不需要更多的处理,也不需要定期触发任何逻辑。