Azure WebJobs - 基于用户的单例 WebJob
Azure WebJobs - Singleton WebJob on user basis
我需要运行,在预定的时间段内,为不同的用户做一份工作(例如 CRM 同步)。此同步由另一个函数放置在 ServiceBus 队列上的消息触发,该函数由 TimerTrigger 每 30 分钟触发一次。
现在我需要的是避免每个用户作业并行 运行 多次,即如果前一个作业是未完成。
让我们想象一下:
- 早上09:00,执行TimerTrigger函数。这个函数决定了用户A和用户B必须同步。对于每个用户,都会在 ServiceBus 队列中放置一条消息。
- 只要将消息放入 ServiceBus 队列,就会触发不同的 Azure WebJob。生成作业并执行 运行ning.
- 在 09:10 用户 A 同步作业完成,而用户 B 仍在 运行ning。假设即使在 09:30.
时它仍然是 运行ning
- 在09:30,再次执行TimeTrigger函数。此函数再次确定用户 A 和 B 必须同步。队列中的消息再次放入
- 因为这两条消息,函数又被触发了两次,但是目前用户B有两个并发函数运行ning
如何避免这种情况?
我是否必须为 Azure Lease Blob 手动实现逻辑?
谢谢。
使用 WebJob 的 [Singleton] 属性。这就像一个分布式锁。在下面,它是通过 blob 租约实现的。这是一个方法级别的属性。您可以提供一个 "scope" 来确定锁的粒度;范围可以基于绑定数据
有关详细信息,请参阅 https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton。
我需要运行,在预定的时间段内,为不同的用户做一份工作(例如 CRM 同步)。此同步由另一个函数放置在 ServiceBus 队列上的消息触发,该函数由 TimerTrigger 每 30 分钟触发一次。
现在我需要的是避免每个用户作业并行 运行 多次,即如果前一个作业是未完成。
让我们想象一下:
- 早上09:00,执行TimerTrigger函数。这个函数决定了用户A和用户B必须同步。对于每个用户,都会在 ServiceBus 队列中放置一条消息。
- 只要将消息放入 ServiceBus 队列,就会触发不同的 Azure WebJob。生成作业并执行 运行ning.
- 在 09:10 用户 A 同步作业完成,而用户 B 仍在 运行ning。假设即使在 09:30. 时它仍然是 运行ning
- 在09:30,再次执行TimeTrigger函数。此函数再次确定用户 A 和 B 必须同步。队列中的消息再次放入
- 因为这两条消息,函数又被触发了两次,但是目前用户B有两个并发函数运行ning
如何避免这种情况?
我是否必须为 Azure Lease Blob 手动实现逻辑?
谢谢。
使用 WebJob 的 [Singleton] 属性。这就像一个分布式锁。在下面,它是通过 blob 租约实现的。这是一个方法级别的属性。您可以提供一个 "scope" 来确定锁的粒度;范围可以基于绑定数据 有关详细信息,请参阅 https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton。