【发布时间】:2023-04-01 19:09:01
【问题描述】:
我需要在预定时间段内为不同用户运行作业(例如 CRM 同步)。此同步由另一个函数放置在 ServiceBus 队列上的消息触发,该函数由 TimerTrigger 每 30 分钟触发一次。
现在我需要避免每个用户作业并行运行多次,即,如果前一个作业未完成,我需要阻止为同一用户处理同一作业。
让我们像这样可视化:
- 早上09:00,TimerTrigger函数被执行。此函数确定用户 A 和用户 B 必须同步。对于每个用户,都会在 ServiceBus 队列中放置一条消息。
- 只要将消息放入 ServiceBus 队列,就会触发不同的 Azure WebJob。作业已生成并正在运行。
- 09:10 用户 A 同步作业完成,而用户 B 仍在运行。假设它在 09:30 时仍在运行。
- 09:30,TimeTrigger 函数再次执行。此函数再次确定用户 A 和 B 必须同步。再次放入队列中的消息。
- 由于两条消息再次触发函数两次,但当前有两个并发函数正在为用户 B 运行。
如何避免这种情况?
我是否必须为 Azure Lease Blob 手动实现逻辑?
谢谢。
【问题讨论】:
-
其实我也很想知道一个很好的答案:D 顺便说一句,你有没有想过如果 WebJob 不能为用户获得租约,它会做什么?它会直接退出,标志着运行成功,还是应该稍后再次运行?
-
我刚刚决定将这份工作标记为成功。
-
这确实让事情变得更容易:)
-
我的意思是,在我的工作中,我租了一份租约(为那个用户设计的)。如果同一用户的并发作业进入,则使用相同的租用,但由于已经给出,该作业会收到“冲突”异常。在这种情况下,我只是捕捉到异常,然后继续。
-
将服务总线队列触发的函数标记为单例。还一次处理一条消息 (MaxConcurrentCalls = 1)。因为 servicebus queue 保证 FIFO 有序交付,所以你不会有任何问题。
标签: azure azure-webjobs