【问题标题】:Write Blob MetaData and Pages Atomically以原子方式写入 Blob 元数据和页面
【发布时间】:2016-11-08 22:51:56
【问题描述】:

有没有办法在 Azure 存储中为 Page Blob 原子地写入数据和元数据?

考虑一个有多个写入者的页面 blob。

我看到了将元数据用于记录计数、序列号、blob 数据的一般结构等方面的建议。但是,如果两个写入者写入数据然后必须更新元数据,是否存在每个写入并尝试通过读取当前计数然后更新来更新记录计数的竞争。读0写1,其实有2个。

这同样适用于元数据写入不是由特定于该写入的内容(例如,每个写入然后将 new 名称-值对写入元数据)。

以下建议似乎对我不起作用。

// 512 byte aligned stream with my data
Stream toWrite = PageAlignedStreamManager.Write(data);

long whereToWrite = this.MetaData.TotalWrittenSizeInBytes;
this.MetaData.TotalWrittenSizeInBytes += toWrite.Length;

await this.Blob.FetchAttributesAsync();
if (this.MetaData.TotalWrittenSizeInBytes > this.Blob.Properties.Length)
{
     await this.Blob.ResizeAsync(PageAlignedMemoryStreamManager.PagesRequired(this.MetaData.TotalWrittenSizeInBytes) * PageAlignedMemoryStreamManager.PageSizeBytes * 2);
}

this.MetaData.RevisionNumber++;
this.Blob.Metadata[STREAM_METADATA_KEY] = JsonConvert.SerializeObject(this.MetaData);

// TODO: the below two lines should happen atomically
await this.Blob.WritePagesAsync(toWrite, whereToWrite, null, AccessCondition.GenerateLeaseCondition(this.BlobLeaseId), null, null);
await this.Blob.SetMetadataAsync(AccessCondition.GenerateLeaseCondition(this.BlobLeaseId), null, null);

toWrite.Dispose();

如果我没有明确调用 SetMetaData 作为下一个操作,它不会被设置:(

【问题讨论】:

    标签: azure-blob-storage


    【解决方案1】:

    有没有办法在 Azure 存储中原子地写入数据和元数据?

    是的。您可以尝试以这种方式自动更新数据和元数据。当我们使用以下代码 sn-p 设置/更新 blob 元数据时,它存储在当前 blob 对象中。目前,没有进行网络调用。

    blockBlob.Metadata["docType"] = "textDocuments";
    

    当我们使用以下代码更新 blob 时,它实际上是调用设置 blob 内容和元数据。如果上传失败,则不会更新 Blob 内容和元数据。

    blockBlob.UploadText("new content");
    

    但是,如果两个写入者写入数据然后必须更新元数据,那么是否存在每个写入并尝试通过读取当前计数然后更新来更新记录计数的竞争。读0写1,其实有2个。

    Azure Storage 支持这三种数据concurrency strategies(乐观并发、悲观并发和 Last writer wins),我们可以通过 ETag 属性使用乐观并发控制,也可以通过 ETag 属性使用悲观并发控制strong>租用,这可以帮助我们保证数据的一致性。

    【讨论】:

    • 由于 SDK 是 HTTP REST 服务的包装器,我在哪里可以看到这种行为?当您 UploadText 时,似乎进行了两次调用,一次用于元数据,一次用于数据。我找不到在文档中设置两者的任何内容。我将尝试运行代码并捕获网络流量,看看它是否真的是一个调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2013-08-02
    • 2018-09-20
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多