Azure WebJobs - 基于用户的单例 WebJob

标签 azure azure-webjobs

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

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

让我们这样想象:

  • 早上09:00,TimerTrigger函数被执行。该函数决定用户A和用户B必须同步。对于每个用户,ServiceBus 队列上都会放置一条消息。
  • 一旦将消息放入 ServiceBus 队列,就会触发不同的 Azure WebJob。作业已生成并正在运行。
  • 在 09:10,用户 A 的同步作业完成,而用户 B 的同步作业仍在运行。假设它在 09:30 仍在运行。
  • 09:30,TimeTrigger函数再次执行。该函数再次确定用户A和B必须同步。队列上的消息被再次放入。
  • 由于这两条消息,函数再次被触发两次,但当前用户 B 有两个并发函数在运行。

如何避免这种情况?

我是否必须手动实现 Azure 租赁 Blob 的逻辑?

谢谢。

最佳答案

使用WebJob的[Singleton]属性。这就像分布式锁。在底层,它是通过 blob 租赁来实现的。这是方法级别的属性。你可以提供一个“范围”来决定锁的粒度;并且范围可以基于绑定(bind)数据 请参阅https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton更多细节。

关于Azure WebJobs - 基于用户的单例 WebJob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48259244/

相关文章:

Azure Cosmos Db 文档 - 想要对文档中已删除的属性使用 ReplaceDocumentAsync

Azure Blob - 缓存控制未保存

azure - 网络作业 "host is not running"。如何调试?

Azure Web 作业 Zip 部署因大小而出错

azure - 在web jobs sdk中使用ServiceBus时更新锁定

azure - 通过 Jenkins 监控 Azure

azure - 如何使用 Powershell 从本地计算机在 Azure Windows 虚拟机 (VM) 中运行 "sysprep/generalize”?

azure - 我可以使用 Azure Active Directory 进行测试吗

Azure Webjob 支持异步执行(如果支持)如何?

azure - 在 Azure Webjobs 中找不到工作职能