使用Azure BlockBlob进行日志记录(使用多个编写器方案写入文本文件)

时间:2016-07-13 09:37:10

标签: azure azure-storage-blobs

我想使用“经典”的日志方法将文本行写入文本文件。我没有在本地保存,而是想将数据写入blockblob。这是代码:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(StorageConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer share = blobClient.GetContainerReference("logStorage");
var logFile=share.GetAppendBlobReference("mylog.log");
logFile.AppendText("This is a log entry");

这是有效的,但仅在单作者场景中,因为文档明确指出AppendText():

  

此API应严格用于单个编写器方案,因为   API内部使用append-offset条件头来避免   重复的块在多个编写器场景中不起作用。

因此,如果我需要在多作者场景中使用该功能,我还需要使用哪种功能作为替代方案?

2 个答案:

答案 0 :(得分:1)

@OleAlbers,正如@ TamraMyers-微软所说,以下描述来自"避免重复或延迟追加" REST API Append Block,它是多作者场景的一种方式。

  

在多作者场景中,每个客户端都可以使用条件标头,但就性能而言,这可能不是最佳方法。

但参考文献也如下所述。

  

对于最高并发附加吞吐量,应用程序应处理其应用程序层中的冗余附加和延迟附加(例如,在附加的数据中添加时期或序列号)。

我认为简单&满足您需求的最佳方法是使用无锁解决方案(例如Dataflow library的新Async CTP)来异步执行多作者操作。

您可以尝试参考教程How to: Write Messages to and Read Messages from a Dataflow Block来重写单作者代码以适合多作者场景。

答案 1 :(得分:0)

对于多作者场景,请调用Append Block而不是AppendText。请参阅客户端库中的AppendBlock方法。

Append Block提供原子性,但将有效负载限制为单个块的大小。