Azure WebJobs - 基于用户的Singleton WebJob

时间:2018-01-15 08:27:28

标签: azure azure-webjobs

我需要在预定的时间段内为不同的用户运行工作(例如,CRM同步)。此同步由每隔30分钟由TimerTrigger触发的另一个函数放置的ServiceBus队列上的消息触发。

现在我需要的是避免每个用户作业并行运行多次,即如果前一个作业没有完成,我需要阻止同一个用户处理同一个作业。 / p>

让我们像这样形象化:

  • 早上9点,执行TimerTrigger功能。此函数确定用户A和用户B必须同步。对于此用户中的每个用户,将放置ServiceBus队列上的消息。
  • 只要将消息放入ServiceBus队列,就会触发不同的Azure WebJob。生成作业并执行正在运行。
  • 在09:10用户同步作业完成,而用户B仍在运行。我们假设即使在09:30它仍然在运行。
  • 在09:30,再次执行TimeTrigger功能。此函数再次确定用户A和B必须同步。队列中的消息再次放入。
  • 由于两条消息,函数再次被触发两次,但目前有两个并发函数正在为用户B运行。

如何避免这种情况?

我是否必须手动实现Azure Lease Blobs的逻辑?

感谢。

1 个答案:

答案 0 :(得分:3)

使用WebJob的[Singleton]属性。这就像一个分布式锁。在下面,它是用blob租约实现的。这是方法级别属性。你可以提供一个"范围"它决定了锁的粒度;范围可以基于绑定数据 有关详细信息,请参阅https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton