私の理解では、Azure CloudAppendBlob は、この BLOB ストレージにのみ追加でき、E タグを比較する必要がないため、同時実行の問題から安全であるということでした。この投稿で述べたように:
具体的には:
さらに、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ジョブがあり、これが設計されたものだと思ったので、これをやろうとしている理由は何ですか?