10

私の理解では、Azure CloudAppendBlob は、この BLOB ストレージにのみ追加でき、E タグを比較する必要がないため、同時実行の問題から安全であるということでした。この投稿で述べたように:

http://blogs.msdn.com/b/windowsazurestorage/archive/2015/04/13/introducing-azure-storage-append-blob.aspx

具体的には:

さらに、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ジョブがあり、これが設計されたものだと思ったので、これをやろうとしている理由は何ですか?

4

4 に答える 4