【问题标题】:Azure WebJobs - Singleton WebJob on user basisAzure WebJobs - 基于用户的单例 WebJob
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2015-08-26
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多