下面我将从几个层面来详细解释淘宝是如何分布图片的。
淘宝的图片分布并非依赖单一的服务器集群,而是采用了一个分层、分布式的架构,其核心可以概括为:
1、集中存储(源站):使用对象存储(如阿里云OSS) 作为图片的“总仓库”。
2、全球分发(边缘):使用内容分发网络(CDN) 将图片缓存到离用户最近的节点。
整个流程可以用下图清晰地展示:
flowchart TD A[用户访问淘宝] --> B{“附近CDN节点<br>有图片吗?”} B -- 有 --> C[直接从CDN节点加载] B -- 没有<br>缓存未命中 --> D[回源到对象存储 OSS] D --> E[CDN节点缓存图片] E --> C C --> F[图片快速呈现给用户] G[商家上传图片] --> H[图片写入对象存储 OSS] H --> I[触发CDN刷新指令<br>使旧缓存失效]
我们详细拆解图中的各个环节。
1. 图片的“总仓库”:对象存储 (OSS)
当商家上传一张商品图片时,这张图片首先会被安全地存放到一个中心化的、高可用的对象存储服务中,对于阿里来说就是阿里云OSS。
海量与持久性OSS是为了存储海量非结构化数据(如图片、视频)设计的,具备极高的持久性(如99.9999999999%),确保图片数据不会丢失。
多副本冗余在OSS内部,一份图片数据会自动在同一个地域的多个可用区(AZ)复制多个副本,这样即使某个机房发生故障,数据依然可用。
弹性扩展理论上容量无限,可以轻松应对淘宝每日亿级的图片上传量。
成本低廉作为冷数据存储,成本远低于直接使用计算服务器的硬盘。
你可以把OSS想象成一个巨大、安全、永不丢失的“中央图书馆”。
如果每次用户看图片都去“中央图书馆”(OSS)取,距离远、速度慢、图书馆入口也会被挤爆,淘宝使用了CDN来解决这个问题。
分布式边缘节点CDN服务商(阿里云自有CDN)在全球部署了成千上万个缓存节点,这些节点分布在各大运营商和各个城市。
就近访问当杭州的用户想加载一张图片时,淘宝的系统会通过DNS调度,将用户的请求引导到杭州本地或华东区域的某个CDN节点上。
缓存机制
命中如果该节点上已经缓存了这张图片,就直接返回给用户,速度极快(通常毫秒级)。
回源如果该节点没有这张图片(比如是刚上传的新图),节点会去“中央图书馆”(OSS)拉取图片,缓存到本地,然后再返回给用户,下一次再有杭州的用户访问同一张图,就可以直接命中缓存了。
当用户请求img.alicdn.com/tfs/...jpg
这样的图片链接时,会发生一次精密的DNS解析过程:
1、 本地DNS会向阿里云的调度系统发起查询。
2、 调度系统会根据用户的IP地址(判断地理位置和运营商),计算出当前延迟最低、负载最轻的最优CDN节点IP返回给用户。
3、 用户直接去那个最优的CDN节点获取图片。
淘宝需要对不同场景展示不同尺寸的图片(缩略图、详情图、放大图等),他们并不存储所有尺寸,而是使用“图片服务” ,链接中通常会包含处理参数,
.../image.jpg_300x300.jpg
(裁切成300x300像素)
.../image.jpg_800x800.jpg
(裁切成800x800像素)
当CDN节点收到这样一个带参数的请求时,如果缓存中没有处理后的图片,它可能会回源到OSS获取原图,然后交由专门的图片处理服务进行实时裁切、压缩、加水印等操作,再将处理后的结果缓存并返回,这套服务在阿里内部称为TFS(Taobao File System)的演进版本,现在已高度云化。
多级回源如果某个CDN节点回源失败,它可能会尝试去同一区域的其他节点获取,形成节点间的互备。
源站容灾OSS本身就在多个可用区有副本,确保源站高可用。
降级策略在极端情况下,即使CDN出现问题,系统也可以降级,直接回源到OSS(虽然速度慢,但保证了可用性)。
预热对于即将上架的热门商品,淘宝可以提前将图片主动推送到全国主要CDN节点,避免上线瞬间大量回源导致源站压力过大。
刷新当商家修改了图片后,需要通知CDN删除旧图片的缓存,以便用户能及时看到新图。
淘宝服务器分布图片的方式是:
一个中心(对象存储OSS) + 千张网络(全球CDN节点) + 智能调度(DNS与负载均衡) + 云端处理(实时图片处理服务)
这种架构完美地解决了高并发、低延迟、高可用、海量存储的四大核心挑战,使得全球数亿用户能够随时随地、飞快地浏览淘宝上数十亿张商品图片,这不仅是淘宝的核心技术,也是现代互联网公司处理静态内容的典范。
文章摘自:https://idc.huochengrm.cn/fwq/16890.html
评论