当前位置: 首页 > Linux

通用图床服务架构解析(百万级回源-天)

时间:2023-04-06 06:18:46 Linux

浩克图床是支持360公司大部分业务的图片服务,支持多种图片处理功能,如:裁剪、压缩、过滤、pHash计算、人脸识别、格式转换、gif首帧提取……等。支持的业务线包括:搜索、图片搜索、新闻、信息流、广告……等,CDN回源图床后台每天150亿+PV。图床的业务逻辑比较简单,抽象为:上传和下载。这里简单分享一下图床两个模块的结构和上传、下载图片时体验到的服务。1.上传模块(Davinci)【Davinci架构图】业务上传图片到图床逻辑大致如下:SDK通过SDK将图片上传到Davinci上传接口(或者业务自己构造HTTP请求),并且接口域名解析的VIP是在Nginx(80端口)之后平衡的。Nginx:80向上游转发Nginx80,将请求负载均衡到后端处理服务(Nginx8360)。上传处理排队后端服务对上传任务进行排队,等待Gearman异步服务进行队列消费和任务调度,返回一个任务ID给上传请求,用于查询处理结果。图片初始处理和存储Gearmanworkers对图片进行异步处理,如压缩、初始裁剪、人脸识别等,并将图片和处理后的元信息存储在Cassandra中。任务ID对应的处理结果存储在Redis中,供用户查询。获取上传结果通过中获取的任务ID获取图片上传及处理结果。PS:ImageBed还支持同步上传和回调通知,将图片上传结果反馈给业务方。2、下载模块(Picasso)【Picasso架构图】用户通过URL请求一张图床的图片,大致流程如下:图片URL根据图床域的CNAME配置请求图片URL名称,并向CDN节点请求。如果请求的CDN节点已经缓存了图片,则直接返回数据。如果CDN回源命中CDN缓存失败,会返回到镜像后台(Nginx80端口)。图床后端缓存(Varnish)为了减少图床后端的计算压力,当图片请求返回到图床后端时,并不直接去存储集群读取和处理图片,而是先使用Varnish前端缓存服务。如果Varnish缓存命中,则直接响应图像数据。Varnishcachemiss如果varnishcachemiss,会转发到Nginx8360端口,再转发给PHPfast-cgi进行图片读取和响应。图片处理在中读取图片数据,在Nginx(8360)层的filter模块中进行处理,在图片url的参数中指定处理规则。例如:指定裁剪宽高、滤镜、黑白、人脸裁剪、gif首帧提取等。该滤镜模块主要使用开源的GraphicsMagick进行图像处理,静态编译成Nginx。处理后的响应数据经过Nginx(8360)层模块处理,获取符合URL指定规则的图片,最终响应并缓存到CDN节点。以上就是图床上传下载模块的处理逻辑。