You need to enable JavaScript to run this app.
导航
性能优化
最近更新时间:2023.11.21 19:34:26首次发布时间:2022.11.09 18:09:14

本文介绍基于 TOS 的内部实现,使应用程序达到较高性能的最佳实践。

背景信息

TOS 是面向海量数据场景设计的分布式对象存储产品。为了向应用程序提供高水平的服务能力,TOS 提供了性能线性扩展以及数据动态负载均衡的优化,内部索引会按照桶名+对象名的 UTF-8 编码范围来进行分区设计。顺序读写模式下,TOS 限制了每秒 QPS 为 2000。关于 TOS 约束的更多信息,请参见约束限制
如果您在一个桶内的对象命名规则中使用了顺序前缀(如时间顺序、字母顺序),可能会导致大量对象的请求访问集中在某个特定分区,造成分区访问热点。热点分区上的服务能力受限于存储介质的读写上限,可能会导致请求速率下降。您可以参考下文列举的方式,优化程序性能。

注意

无论是读取还是写入对象,性能优化都是逐渐发生的,而非立即生效。当您优化顺序前缀后,您仍然有可能遇到部分错误,优化完成后,该部分错误将会消失。

优化方式

为了避免出现上述情况影响应用程序的正常运行,建议您在应用程序设计阶段考虑如下优化:

相邻对象造成的访问热点

  • 将不同业务的数据写入不同的 Bucket 中

    bucket:log
    object:
    20220610-001.log.tar.gz
    20220610-002.log.tar.gz
    20220610-003.log.tar.gz
    ......
    20220610-0xx.log.tar.gz
    
    bucket:meta
    object:
    20220610-001.log.meta
    20220610-002.log.meta
    20220610-003.log.meta
    ......
    20220610-0xx.log.meta
    
  • 分散同一个桶中的对象名或者前缀
    如果您在一个桶内仍然有海量的有序对象,您可以参考以下方式,分散对象名或前缀。

    • 添加随机的前缀。例如将对象名进行散列计算,取 2~10 位散列值作为对象的前缀。

      //原始
      20220610-001.log.tar.gz//sha256:fa473ff003b91aa20239e20e41...
      20220610-002.log.tar.gz//sha256:dba85a4f69850bd8b7ba6fbe79...
      20220610-003.log.tar.gz//sha256:bd6665a44717e3bda18d12ea51...
      ......
      20220610-0xx.log.tar.gz//sha256:a70364eaa3ce1b037c5707b06e...
      //打散后
      fa473f-20220610-001.log.tar.gz
      dba85a-20220610-002.log.tar.gz
      bd6665-20220610-003.log.tar.gz
      ......
      a70364-20220610-0xx.log.tar.gz
      
    • 反转顺序的对象前缀。例如将日期进行反转命名。

      //原始
      20220610-001.log.tar.gz
      20220610-002.log.tar.gz
      20220610-003.log.tar.gz
      ......
      20220610-0xx.log.tar.gz
      //反转后
      100-01602202.log.tar.gz
      200-01602202
      300-01602202
      ......
      1xx-01602202
      

相同对象造成的访问热点

如果应用程序会在同一时刻大量访问同一个对象,您的访问速度会受到 TOS 带宽及地域的限制。建议您使用 CDN 产品,提升性能的同时也能降低您的成本。通过 CDN 访问 TOS 的详细信息,请参见使用 CDN 加速访问 TOS 资源

业务频繁触发 TOS 流控

为了让所有用户得到良好的产品体验,TOS 在服务端设置了流控限制。流控的详细规则,请参见约束限制。TOS 流控说明如下:

  • 列举类:TOS 是 Key-Value 类型的存储服务。为了提升运维体验,TOS 提供了列举类的接口能力。但是不建议您在应用程序中强依赖于列举类型接口。特别是在写入频繁场景下,分页列举的过程中,应用程序无法实时感知前一页新写入或删除的对象,可能会造成应用程序的运行错误。
  • 读写类:如果您设置了上述的防热点优化之后仍然频繁触发 TOS 的流控,建议您在应用程序侧做错峰设计。

说明

触发 TOS 流控场景时,TOS 会明确响应 429 的响应码。建议您在应用程序中主动对 TOS 流控进行降速处理。关于降速处理的方法,请参见 SDK 文档

调整 TOS 的服务端流控限制

如果您的应用程序设置了上述优化之后,仍然无法满足应用程序的性能诉求。您可以提交工单,申请提高流控限制。