我的理解是 Azure CloudAppendBlob 不会出现并发问题,因为您只能附加到此 blob 存储,并且不需要比较 E-tags。正如这篇文章所述:
具体来说:
此外,Append Blob 支持让多个客户端写入同一个 blob 而无需同步(与块和页面 blob 不同)
但是,以下单元测试会引发:
412 未满足指定的附加位置条件。
堆栈跟踪
Microsoft.WindowsAzure.Storage.Blob.BlobWriteStream.Flush()
Microsoft.WindowsAzure.Storage.Blob.BlobWriteStream.Commit()
Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.UploadFromStreamHelper
Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.AppendFromStream
Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.AppendFromByteArray
Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.AppendText
这是单元测试。也许该服务将处理来自不同上下文的请求,但不会像这样并行处理?
[TestMethod]
public void test_append_text_concurrency()
{
AppendBlobStorage abs = new AppendBlobStorage(new TestConnectConfig(), "testappendblob");
string filename = "test-concurrent-blob";
abs.Delete(filename);
Parallel.Invoke(
() => { abs.AppendText(filename, "message1\r\n"); },
() => { abs.AppendText(filename, "message2\r\n"); }
);
string text = abs.ReadText(filename);
Assert.IsTrue(text.Contains("message1"));
Assert.IsTrue(text.Contains("message2"));
}
AppendBlobStorage 中的方法
public void AppendText(string filename, string text)
{
CloudAppendBlob cab = m_BlobStorage.BlobContainer.GetAppendBlobReference(filename);
// Create if it doesn't exist
if (!cab.Exists())
{
try
{
cab.CreateOrReplace(AccessCondition.GenerateIfNotExistsCondition(), null, null);
}
catch { }
}
// Append the text
cab.AppendText(text);
}
也许我错过了一些东西。我之所以尝试这样做,是因为我有多个 Web 作业都可以写入这个附加 blob,我认为这就是它的设计目的?