本文介绍基于 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 会明确响应 429 的响应码。建议您在应用程序中主动对 TOS 流控进行降速处理。关于降速处理的方法,请参见 SDK 文档。
如果您的应用程序设置了上述优化之后,仍然无法满足应用程序的性能诉求。您可以提交工单,申请提高流控限制。