blob.uploadtext来自多个线程的同一个blob

时间:2013-06-08 07:01:01

标签: azure-storage azure-storage-blobs

一个初学者问题,但我无法在其他任何地方找到明确答案。

如果我使用blob.uploadtext()从两个不同的线程同时更新同一个blob会发生什么?后者会失败吗?或后者只是覆盖?

此外,如果我在uploadtext()正在进行时从blob中读取会发生什么?读取是否会返回先前的版本?或者读取失败?如果读取失败,我应该重试吗?

在我的场景中,我有多个worker角色实例,可能会不时更新相同的blob(大小为10 MB)。我不关心谁赢得写,只要他们不破坏blob并且读取blob很长时间没有被阻止。

更新:我写了一个示例程序,将3MB文件从3个不同的线程上传到同一个blobreference。我发现的是这个: 1.如果线程重用了blobReference对象,那么第二个和第三个线程将获得MD5不匹配的异常。但第一个线程仍然可以成功完成上传。 2.如果每个线程都创建自己的BlobClient / BlobReference对象,那么所有上传都将成功,实际的blob内容与完成最后一个的内容匹配。

但是,在我将blob上传的大小增加到10MB文件后,我收到了一个StorageClientException:指定的阻止列表无效。更糟糕的是,blob内容在此异常后以某种方式为0字节。所以我的blob上传失败并消灭了blob内容。这似乎是一个非常严重的问题。有任何想法吗?

以下是示例代码:

        Task[] tasks = new Task[6];

        tasks[0] = Task.Factory.StartNew(() => DoUpload(BlobClient, testStreams, 0));
        tasks[1] = Task.Factory.StartNew(() => ReadBlob(BlobClient,0));
        tasks[2] = Task.Factory.StartNew(() => DoUpload(BlobClient, testStreams, 1));
        tasks[3] = Task.Factory.StartNew(() => ReadBlob(BlobClient, 1));
        tasks[4] = Task.Factory.StartNew(() => DoUpload(BlobClient, testStreams, 2));
        tasks[5] = Task.Factory.StartNew(() => ReadBlob(BlobClient, 2));

        Task.WaitAll(tasks);

DoUpload使用以下内容上传:

        blob.UploadFromStream(streams[i]);

感谢。

0 个答案:

没有答案