gpt4 book ai didi

c# - Azure Web 作业 - 在云中实现互斥

转载 作者:行者123 更新时间:2023-11-30 19:15:42 25 4
gpt4 key购买 nike

我们正在考虑构建一个系统,该系统具有需要互斥的代码区域。在单个服务器上的专用托管环境中,我们可以使用在多个线程上运行的简单代码:

SomeAsyncOperation();
lock(locker)
{
SomeSyncOperation1();
SomeSyncOperation2();
}

这可以在云中运行吗(假设 webjobs 可以跨多台物理机运行)?特别是 azure 。如果不是,这将如何实现?到目前为止我已经看过 CloudBlockBlobcompeting consumer pattern 。人们正在做什么来实现这一目标?

提前致谢。

编辑:更多信息

操作 1 在表上执行查找,如果操作 1 没有找到任何内容,则操作 2 会向队列和表中添加一个条目(否则将引发异常)。为了防止将重复项添加到队列中,操作 1 和操作 2 在所有线程中以原子方式运行(应用程序使用 async/await 运行)非常重要。

以下场景是竞争条件如何出现的示例:

T1        T2
O1()
O1()
O2()
O2()

在线程 T1 操作 1 上尚未找到重复项。线程 T2 出现并添加了一个副本。然后,威胁 T1 运行操作 2,这是它不应该执行的操作。

通常可以使用 lock() 来防止这种情况,但我不认为这可以跨物理机器(例如在云中)工作。除非我错了……

最佳答案

Azure WebJobs SDK有一个声明性 SingletonAttribute ,可应用于作业函数,以确保在任何给定时间仅运行该函数的单个实例,即使跨多个横向扩展实例也是如此。它在幕后通过Azure Blob Leases进行分布式锁定。 。有关 Singleton 的更多信息可以在 wiki 中找到。 。这是一个示例函数(完整示例可以在 samples repo 中找到):

    [Singleton]
public static async Task ProcessWorkItem([QueueTrigger("workitems")] WorkItem workItem)
{
// Do your work - lock is maintained until this function completes
}

只要有新的队列消息写入workitems队列,就会触发此函数。在函数开始执行之前,会获取函数的分布式锁(blob 租约),并一直保持到函数完成为止。如果同时触发该函数的另一个实例,该实例将轮询锁,并在锁释放后开始。

还有其他选项可以与 Singleton 一起使用,包括更细粒度的锁定范围。例如,如果 WorkItem 类型包含 Region 属性,则 [Singleton("{Region}")] 将自动绑定(bind)到该值运行时,因此仅序列化同一区域中项目的函数实例。您还可以跨不同的函数锁定,这将允许您使用相同的单例范围注释两个不同的函数,以便两个函数的实例共享相同的锁。

当然,与进程内线程同步一样,您必须考虑系统中会有多少锁争用并进行相应的设计。

关于c# - Azure Web 作业 - 在云中实现互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34652077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com