Azure Append Blob追加上传时刷新门户/Storage Explorer报409修改错误
问题根因
你遇到的BlobModifiedWhileReading 409错误是启用了分层命名空间的Azure Data Lake Storage Gen2存储账户的Append Blob的已知行为:
- 在Azure门户/Storage Explorer刷新容器时,工具会自动触发Blob元数据(属性、ACL、访问统计等)的读取操作
- Gen2账户的内部实现中,这类读元数据操作会更新Blob的隐藏时间戳属性,相当于修改了Blob的实体状态
- AppendBlock操作默认会校验Blob的状态一致性,检测到状态变更就会抛出该错误
- 你添加的写租约只能阻止其他写入操作,无法阻止读元数据操作,因此无效
可行解决方案
方案1:替换Blob类型(最彻底)
如果业务不强制要求Append Blob的追加写入特性,直接改用普通Block Blob即可,Block Blob在Gen2账户下不存在该类并发冲突问题。
方案2:添加乐观并发重试逻辑(适用必须用Append Blob的场景)
修改你的上传代码,每次追加块前获取当前Blob的ETag,添加请求条件,遇到409错误时自动重试当前块的写入,修改后的核心循环代码参考:
while (readLoop) { byte[] chunk = reader.ReadBytes(ChunkSize); if (chunk.Length == 0) { readLoop = false; continue; } bool uploadSuccess = false; int retryCount = 0; const int maxRetry = 5; while (!uploadSuccess && retryCount < maxRetry) { try { // 先获取当前Blob的ETag var properties = await appendClient.GetPropertiesAsync(); var conditions = new Azure.Storage.Blobs.Models.AppendBlobRequestConditions { IfMatch = properties.Value.ETag }; await appendClient.AppendBlockAsync(new MemoryStream(chunk), conditions: conditions); uploadSuccess = true; } catch (Azure.RequestFailedException ex) when (ex.ErrorCode == "BlobModifiedWhileReading") { retryCount++; await Task.Delay(100 * retryCount); // 指数退避 if (retryCount >= maxRetry) throw; } } readLoop = chunk.Length == ChunkSize; }
方案3:升级SDK版本
你当前使用的Azure.Storage.Files.DataLake 12.8.0版本较老,升级到最新稳定版SDK,官方已经在新版中对该类常见冲突添加了默认重试逻辑,大概率可以直接解决问题。
临时规避方案
上传期间关闭Storage Explorer的自动刷新功能,避免在上传过程中通过门户/Storage Explorer访问对应Blob的详情页面,可临时规避该问题,但不适用于生产多用户并发场景。
内容的提问来源于stack exchange,提问作者user3501292
相关产品推荐
相关产品推荐

