【问题标题】:Lock C# code for different Azure webjobs为不同的 Azure webjobs 锁定 C# 代码
【发布时间】:2017-11-19 09:38:47
【问题描述】:
我在 Azure 中运行了 2 个不同的 Web 作业(一个是计划的,一个是连续的)。第一个 webjob 中的一段代码与第二个 webjob 中的一段代码冲突(代码不完全相同),我想阻止它们并行运行。
我正在考虑在这里使用 blob 租约。或者,当我阅读here 时,Azure Webjobs SDK 支持单例属性。是否可以将此属性应用于不同网络作业中的方法并具有共同的范围(或下面的共同锁)。
你能想到任何替代方法吗?
【问题讨论】:
标签:
azure
azure-webjobs
azure-webjobssdk
【解决方案1】:
是否可以将此属性应用于不同 webjob 中的方法并具有共同的范围(或下面的共同锁)。
根据我的经验,使用blob lease 是个好主意。
Blob 租约允许您声明对 Blob 的所有权。获得租约后,您就可以更新 Blob 或删除 Blob,而不必担心另一个进程在您下面更改它。
你能想到任何替代方法吗?
ETags 也用于乐观并发控制。更多细节我们可以参考this。
string ETag (r/o) – 这是资源特定版本的标识符。这用于 Web 缓存验证,并允许客户端发出条件请求。 ETags 也用于乐观并发控制。例如,如果您正在读取一个 blob 并保存了 ETag,然后进行了一些其他处理并返回上传该 blob 的新版本,您可以再次读取 ETag 并与之前的值进行检查。如果 ETag 值匹配,则文件没有更改,您可以上传它的新版本。如果匹配失败,存储服务会返回412错误(前置条件失败)。