Azure CloudAppendBlob错误与并发访问

Jam*_*mes 10 c# concurrency azure blobstorage

我的理解是Azure CloudAppendBlob不会出现并发问题,因为您只能附加到此blob存储,并且不需要比较E-tags.正如这篇文章所述:

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
Run Code Online (Sandbox Code Playgroud)

这是单元测试.也许该服务将处理来自不同上下文的请求,但不是这样的并行?

    [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"));
    }
Run Code Online (Sandbox Code Playgroud)

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);      
    }
Run Code Online (Sandbox Code Playgroud)

也许我错过了什么.我试图这样做的原因是因为我有多个web作业都可以写入这个附加blob而我认为这是它的设计目的?

Jam*_*mes 10

经过一番搜索后,看起来这是一个实际问题.

我猜AppendBlobStorage相当新.(目前AppendBlobStorage还有其他问题.请参阅

http://blogs.msdn.com/b/windowsazurestorage/archive/2015/09/02/issue-in-azure-storage-client-library-5-0-0-and-5-0-1-preview- in-appendblob-functionality.aspx)

无论如何,我通过使用AppendBlock varient而不是AppendText修复了这个问题,如下所示:

https://azurekan.wordpress.com/2015/09/08/issues-with-adding-text-to-azure-storage-append-blob/

对appendtext方法的更改,该方法通过了上面定义的单元测试

    public void AppendText(string filename, string text)
    {
        if (string.IsNullOrWhiteSpace(filename))
            throw new ArgumentException("filename cannot be null or empty");

        if (!string.IsNullOrEmpty(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 (StorageException) { }
            }

            // use append block as append text seems to have an error at the moment.
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(text)))
            {
                cab.AppendBlock(ms);
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)