我正在使用Azure SDK 2.2版。我有问题,在我的代码中可能有多台机器调用此代码

CloudPageBlob _pageBlob = .....
try
{
    _pageBlob.FetchAttributes();
}
catch
{
    //container does not exist
    _pageBlob.Create(AllocatedBlobSize);
}

我已经对其进行了测试,得出的结论是,多次调用_pageBlob.Create(AllocatedBlobSize); 会清除先前的数据。如何确保只有一台计算机获胜并创建CloudPageBlob? (我希望其他人失败)我期望多个Create调用会导致异常,但这不是正在发生的事情:(。

编辑:在我们的体系结构中有一个领导者和X个跟随者。我正在使用CloudPageBlob + ETAG选举新的领导者(只有一台机器能够将其元数据写入CloudPageBlob =新的领导者)。但是,在极端情况下,当此云页Blob可能损坏+领导者死亡时(或者我们正在开始,尚无领导者)。在这种情况下,我需要创建新的CloudPageBlob(通常由领导者创建)=>每台机器都试图创建它并将其元数据写入其中(每个人都想成为领导者)。理论上,如果2台机器正在执行此代码。机器A调用_pageBlob.Create(),没有错误,并写了以元数据为首的元数据。机器B调用_pageBlob.Create(),没有错误,机器A重写了机器A(+可能还有更多数据)的元数据。我希望机器B失败:)。最大的问题是我正在丢失数据。

最佳答案

我发现的解决方案是使用AccessCondition.IfNotModifiedSince。

var timeOffset = new DateTimeOffset(new DateTime(1, 1, 1), TimeSpan.FromMilliseconds(0));
var cond = AccessCondition.GenerateIfNotModifiedSinceCondition(timeOffset);
var options = new BlobRequestOptions ();
pageBlob.Create(AllocatedBlobSize, cond, options);

现在,如果我在相同条件下第二次调用CloudPageBlob.Create(),则第二次调用失败。我到底想要什么。谢谢大家的帮助。

关于azure - Azure CloudPageBlob创建-如何实现CreateIfNotExist,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22358374/

10-11 08:52