自动写入Blob元数据和页面



是否有一种方法可以在azure存储中为Page blob自动写入数据和元数据?

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

我看到建议使用元数据的事情,如记录计数,序列号,blob的数据的一般结构。但是,如果两个写程序写入数据,然后必须更新元数据,那么每个写程序都试图通过读取当前计数然后更新记录计数,这不是一种竞争吗?读取0和写入1,但实际上有2个。

同样适用于元数据写入没有特定于该写入的内容的任何场景(例如,每次写入然后将新的名称-值对写入元数据)。

下面的建议似乎对我不起作用

// 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元数据时,它存储在当前blob对象中。目前没有网络呼叫。

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

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

blockBlob.UploadText("new content");

然而,如果两个写程序写入数据,然后必须更新元数据,那么每个写程序都试图通过读取当前计数然后更新记录计数,这不是一个竞争吗?读取0和写入1,但实际上有2个。

Azure Storage支持这三种数据并发策略(乐观并发,悲观并发和最后一个写入者获胜),我们可以通过ETag属性使用乐观并发控制,或者通过租约使用悲观并发控制,这可以帮助我们保证数据的一致性。

最新更新