500px 是一个国际大型图片类网站,致力于摄影分享、发现、售卖的专业平台
需要处理海量用户上传的图片,并且有N倍于上传量的图片展示量
根据一年前公布的数据,500px 每天会产生20TB的数据传输量
500px 的基础架构
开发语言主要是 Ruby on Rails
前端请求处理使用 Nginx
服务集群使用 HAProxy 处理负载均衡
数据存储使用 MySQL, MongoDB, Redis, Memcached
Sidekiq 在后台做任务处理
服务器使用 Amazon 的弹性云服务 EC2
图片存储使用 Amazon 的云存储 S3
大规模的使用了微服务,例如:
搜索相关的服务,基于 Elasticsearch
内容相关服务
动态信息服务
图片处理服务
为前端提供接口的API服务
500px 的图片处理
图片处理是重点服务,500px 使用了3个微服务
这3个微服务都是使用Go开发的,500px的这个选择是因为:Go可以很好的处理并发、代码少、运行快,适合图片服务的场景
第一个服务是处理图片上传的 Media Service
接收用户上传的图片,做一些简单的逻辑处理,保存到S3,然后在 RabbitMQ 队列中添加一个任务,交给后续处理流程
第二个是图片转换服务 Converter Service
消费 RabbitMQ 队列,然后从S3中取得相应原图,对其进行一连串的处理,例如生成一系列不同尺寸的小图,再保存到S3,这些小图很重要,在网站和手机应用中的很多地方都会用到
前期,这两个服务已经够用了,能够对用户上传的图片进行相应处理,保存到S3,提供CDN源,这就满足了基本需求
后来,随着网站规模的增长,发现这套方案成本高、空间利用率低,并且当需要新尺寸的图片时非常不灵活
解决的方法就是新增了一个微服务 Resizer Service
把生成小图的功能从 Converter Service 中提取出来,由 Resizer Service 专门处理,他能根据原图动态的生成任意尺寸或者格式的小图、添加水印、对图片进行参数修改
CDN源也从 Converter Service 转到了 Resizer Service
Resizer Service 相当高产,这个服务集群可以在高峰期处理1000个请求/秒,图片的缩放和水印等是计算密集型操作,所以,在高峰期要保障合理的响应时间是个不小的挑战,500px为此做了很多优化,实现了在高峰期时,95%的响应时间在180ms以下,非高峰期,在150ms以下
优化的功臣之一是 VIPS 图片处理库,主要特点:
(1)提供了一系列滤镜、色彩处理、几何变换等强大功能
(2)支持相当多的格式,如 JPEG、TIFF、PNG、GIF、WebP、FITS、OpenEXR ……
(3)处理速度非常快、内存占用少
500px 还在试验更多的优化方法,以达到更低的响应时间