更新时间:2024-10-23 GMT+08:00

追加写对象

使用场景

流式上传、表单上传、多段上传在上传结束之后内容是固定的,只能读取,不能修改。如果Object内容发生了改变,只能重新上传同名的Object来覆盖之前的内容。

对于上传日志、视频监控和视频直播等领域生成的实时视频流,使用以上上传方式,会存在软件架构复杂、客户端发送请求频繁造成服务器压力大、数据延时等问题。为了解决以上问题,可以使用追加写的方式上传对象,就是在指定桶内的一个对象尾追加上传数据,做到及时可读。当不存在相同对象键值的对象时,则创建新对象。

通过追加上传,可在视频数据产生之后及时将数据上传至同一个Object,而客户端只需要定时获取该Object的长度,并与上次读取的长度进行对比。如果发现有新的可读数据,则触发一次读操作来获取新上传的数据部分即可。通过这种方式可以简化架构,增强扩展性。

使用限制

  • 每次追加上传都会更新该对象的最后修改时间。
  • 服务端加密SSE-C方式,那么追加上传和初始化段一样,设置诸如x-obs-server-side-encryption之类的请求Header,后续追加上传也必须携带。
  • 服务端加密SSE-KMS方式,有且只有第一次上传且桶内不存在同名对象时,才设置诸如x-obs-server-side-encryption之类的请求Header,后续追加上传不携带。
  • 每次追加上传的长度不能超过对象长度上限5G的限制。
  • 每个Appendable对象追加写次数最多为10000次。
  • 如果对象存储类型为COLD(归档存储)或DEEP_ARCHIVE(深度归档存储),则不能调用该接口。
  • 如果桶设置了跨区域复制配置,则不能调用该接口。
  • 并行文件系统不支持追加写对象。
  • 对一个已经存在的Appendable对象进行Put Object操作,那么该Appendable对象会被新Object覆盖,类型变为Normal对象,反之出错。
  • Appendable对象复制后变成Normal对象,不支持Appenable对象复制成Appendable对象。

注意事项

  • 当文件不存在时,调用AppendObject接口会创建一个追加类型文件。
  • 在开启了WORM开关的桶中,使用追加写上传对象将失败并返回403。
  • ETag返回的是本次追加上传数据的Hash值,不是整个对象的Hash值。
  • 当追加文件已存在时:
    • 如果待追加的文件为追加类型文件,当设置的追加位置和文件当前长度相等,则直接在该文件末尾追加内容;当设置的追加位置和文件当前长度不相等,则抛出PositionNotEqualToLength异常。
    • 如果待追加的文件为非追加类型文件时,例如通过简单上传的文件类型为Normal的文件,则抛出ObjectNotAppendable异常

使用方式

OBS支持通过SDK、API方式追加写对象。