是否有一种方法可以在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属性使用乐观并发控制,或者通过租约使用悲观并发控制,这可以帮助我们保证数据的一致性。