Azure Blob:容器、Blob 类型与对象身份
类型、属性与块提交模型
前置是HTTP请求、字节流和对象名称。目标是选择Blob类型并理解完整对象何时对读者可见。示例未执行;以下判断针对Azure Blob服务与Python v12 API,不把文件系统语义套用到对象存储。
Azure Blob 三种类型选择
Azure Blob 三种类型选择:Block Blob适合文档、图片和批量数据,Append Blob支持向尾部追加,Page Blob服务于按页随机更新的场景。类型影响写入协议与限制,不能把同一upload_blob调用在三类对象上理解为完全相同。普通文件上传优先考虑Block Blob,并明确是否允许覆盖。
练习:多进程日志追加是否天然恰好一次?答案是否定的。Append请求响应丢失后重试可能重复追加,应结合追加位置条件、应用序列号与去重策略。Page Blob的对齐与大小规则也不能用Block Blob的块规则替代。配套工程只创建Block Blob,以便聚焦条件写入和显式块提交。
Azure Blob ETag 与属性
Azure Blob ETag 与属性:ETag是服务维护的状态标识,元数据是应用写入的键值属性;ETag不是内容哈希,不能用它证明字节相等。get_blob_properties读取长度、ETag、内容类型等属性而不下载内容;download_blob返回下载器,需readall或流式读取才能取得字节。
Content-Type决定客户端解释字节的方式,不能只靠名称扩展名;UTF-8正文应显式设置text/plain; charset=utf-8。元数据和Blob index tags用途不同,设置元数据或tags通常替换对应集合,应先读取、合并并带条件写入。工程使用exercise_run防止误清理,恶意同权限写者仍可伪造,所以必须有独立容器和身份范围。
Azure Blob 分块提交可见性
Azure Blob 分块提交可见性:stage_block只上传未提交块,commit_block_list按给定顺序发布对象内容;未提交块不是读者已可读取的完整新版本。块ID在同一Blob内长度必须一致,本工程用8位编号作为SDK输入,SDK负责协议编码。提交遗漏某个块,就不会自动把它插回最终内容。
应用应将最终长度、摘要、块次序与ETag一起纳入核对。相同块ID重复stage会替换该未提交块,重试必须复用相同字节;另一写者复用ID会互相覆盖,故应隔离目标名称或协同租约。提交采用读得的ETag条件,避免在并发覆盖后无条件发布。块暂存不构成跨对象事务。
Azure Blob 上传幂等与重试
Azure Blob 上传幂等与重试:传输重试处理临时故障,业务幂等决定重复请求的业务结果。SDK自动分块与重试不会使多写者对同一名称安全;覆盖上传、Append追加、提交块清单的重试后果各不相同。响应超时意味着结果未知,不能直接认定服务端未写入。
工程先用overwrite=False创建全新名称,再带IfNotModified更新,暂存块使用固定ID与固定字节。若首次创建响应丢失,下一次可能返回已存在;先查精确名称、元数据、内容和请求日志,再决定恢复,不能自动无条件覆盖。若提交成功但响应丢失,旧ETag重试可能412,应重新核对当前内容与业务操作ID。生产使用不可变名称加独立业务索引时,索引发布也需要自己的并发协议。
官方依据
账号、容器与命名空间
本课适合了解HTTP与文件路径的读者,目标是准确定位一个对象以及管理边界。全文是理论与未执行示例,资料核对日2026-10-17;配套工程选用Python SDK azure-storage-blob 12.25.1,不代表其他SDK或云环境具有相同默认值。
Azure Blob 账号与容器
Azure Blob 账号与容器:存储账号承载服务端点、网络和冗余策略,容器组织Blob并提供授权作用域。一个Blob的身份由账号、容器、名称共同确定;同名对象在不同容器不是同一对象。创建存储账号属于管理平面,上传字节属于数据平面,两者需要分别授权。容器不能嵌套,应用把租户ID写在名称里并不自动得到权限隔离。
设计练习:同一账号的租户A与B可以只靠a/和b/前缀隔离吗?答案是不能。普通Blob前缀是名称的一部分,列举过滤不是鉴权规则;应选择受限容器作用域身份、精确SAS资源范围,或符合所用账号模式的其他授权机制,并测试越权请求。容器默认采用私有访问;启用静态网站、公开访问等是额外决策。
Azure Blob 名称与虚拟目录
Azure Blob 名称与虚拟目录:在平面命名空间中,斜杠属于对象名称,前缀提供展示层次;把logs/2026/a.txt改成archive/a.txt通常涉及复制与删除,并非本地文件系统rename。名称区分大小写,URL编码必须由SDK正确处理。给文件系统路径做简单字符串替换容易损坏空格、百分号、Unicode和斜杠的含义。
HNS启用后引入真实目录语义、目录ACL等Data Lake能力,不能据此反推所有Blob保护功能都相同。账号是否启用HNS应在设计阶段确认;本课工程固定HNS关闭,并不使用DFS端点。选择命名约定时将业务ID、不可变对象ID和可读文件名分开,不把可修改文件名当数据库主键。
Azure Blob 列举与分页
Azure Blob 列举与分页:list_blobs返回惰性分页结果,迭代时才继续请求服务;name_starts_with减少返回范围,但不构成访问控制。业务若只读取第一页,会误判历史对象或大目录不存在。分页标记是服务给出的续传信息,不应自行解析成数组下标;批处理应记录已完成的对象标识,并能处理遍历期间新增或删除的对象。
正常列举不等于完整恢复清单。只有显式include版本、快照或已删除状态,并检查相应字段,才能区分当前对象与历史数据。工程inspect仅过滤精确名称展示信息,清理绝不通过列举前缀批量删除。即使匹配run_id也先验证当前对象的所有权与ETag。
Azure Blob 冗余与可用性边界
Azure Blob 冗余与可用性边界:冗余复制提高故障可用性,备份保留独立恢复点;复制系统也可能传播应用误删。选择LRS、ZRS或地理冗余时需结合地区、账号支持、恢复点目标与恢复时间目标,不能把“有多份副本”解释成能回滚任意时间。地理复制的状态与故障切换还涉及潜在数据丢失窗口。
练习:程序覆盖了昨天的合同,冗余是否保证找回?答案取决于事先配置的版本、软删除、快照或独立备份,以及保留期和实际恢复测试。先暂停写入、防止清理策略继续消耗恢复点,再核对对应保护路径。没有恢复点时不能从ETag反推出旧内容。
官方依据
继续阅读
- Azure Blob身份与保护契约
- Azure Blob完整SDK工程
- Azure Blob身份与保护契约