每秒处理10万张图片 imgix用了哪些技术?

imgix 提供了实时的图片处理和传输服务

典型需求示例

一个图片在不同设备中需要有不同的显示尺寸,如果网站自己处理会很麻烦,交给 imgix 则非常简单

通过一个 URL API,imgix就知道要对哪张图片做什么处理,实时的把处理后的图片输出出来

例如

https://xx.imgix.net/desk.jpg?w=600&exp=1

就是处理 desk.jpg 这张图片,把宽度缩放到600,曝光度的值设为1

所以,在不同场景需要不同的图片效果时,只需要设置相应的 URL 参数即可

技术挑战

imgix 的图片处理能力非常强,如缩放、裁剪、旋转、调整光泽度、色度二次抽样率、色彩量化 ......

所有效果都是通过 URL参数来设置,现在已经有80多个参数,通过组合,可以实现非常复杂的效果

图片处理高复杂度,和高速增长的访问量,对 imgix 的计算能力和快速响应能力提出了很大挑战

imgix 架构

基础设施

刚开始 imgx 构建在 Amazon 的弹性云计算 Ec2 之上,后来随着用户的增加,性能问题突显,如果基于云服务进行系统扩展,imgx 认为以后会更加痛苦,所以决定构建自己的处理中心

图片处理是 imgix 的根本,经过调研,最后采用了苹果的 Core Graphics 框架作为基础

Core Graphics 基于高级的绘制引擎,提供了轻量级的底层渲染能力,可以处理基于路径的绘制、图片转换、色彩管理、幕后渲染、图片数据管理 等等复杂的操作

苹果是图像处理的专家,技术采用了苹果的,那么硬件自然还是苹果的最适合,当时订购了大批 Mac Mini 作为图片处理服务器,在苹果开发了 Mac Pros(专业级图形工作站) 之后,imgix 又购买了 Mac Pros 作为新的图片处理节点

对于非图片处理的需求,使用Linux服务器

服务结构

imgix 的核心架构是由很多服务组成的,例如

图片源获取服务、图片源缓存服务、图片处理服务、负载均衡和分发服务、内容传输服务 ……

图片源获取和缓存服务是基于 MogileFS/Nginx/HAProxy,加上大量自定义开发实现的

负载均衡和分发服务是性能的关键,使用 C + LuaJIT框架(Just-In-Time Compiler for Lua) 开发,单机可以每秒处理4万请求,以前不是使用 LuaJIT,使用的是 Python,转到 LuaJIT 后,发现性能提升了20倍

图片处理服务是 imgix 打磨最多的服务,硬件使用苹果机器,技术使用 C/Objective-c/Core Graphics,最大程度的使用 GPU 来处理图片,性能优化的重点就是如何更高效的使用GPU buffer

图片处理服务的质量保证极度重要,所有相关的修改,都必须经过一整套的回归测试,保证没有引入任何问题

内容传输是最后一公里,使用 Varnish缓存服务器,和实时CDN服务Fastly,对于第一次获取的图片,没有经过缓存时,整个响应时间可以在700ms以下,并且是在高峰期

日志管理

日志是必须的,所有服务的接口必须集成日志服务,imgix 建造了一套全面的日志通道

使用 Heka 处理日志数据的聚合,然后转入 Riemann、Hosted Graphite、Google BigQuery 进行数据的分析统计

系统管理

Ansible 处理系统的配置管理

Consul 管理服务发现

Prometheus 用来监控

使用 StatusPage.io 向客户汇报当前系统状态

前端服务

前端服务为用户提供配置和管理功能,与系统的核心服务完全隔离,在 Docker 容器中进行开发、测试、部署

根据不同的任务需求,使用 Angular、Ember、Tornado 实现

CircleCI 用作内部服务的持续集成和部署

TravisCI 用作开源项目的集成和部署

imgix 还在努力提升系统的处理能力,现在每秒可以处理10万图片,接下来的目标是每秒100万

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2016-05-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏花叔的专栏

小程序支持跳转网页会带来什么影响

11月2日,iphone X 发售的前一晚,微信小程序发布了一个重量级的更新: 小程序内嵌网页能力开发 使用教程很简单: 到mp.weixin.qq.com登录...

70512
来自专栏应用案例

作为一个有追求的程序员,你应该掌握的七种武器

1 科学上网 虽然国内互联网一片热闹的景象,但我们不得不承认,从硬件到软件,从协议到标准,我们现在使用的绝大部分技术都是起源于墙外,而Google是检索这些第一...

20910
来自专栏云市场·精选汇

产品更新——智慧零售V1.3商品+V1.4订单优化上线

选择出库类型,添加商品信息并保存即可。( 出库是减库存操作,出库记录保存后,系统将按照出库单中的商品信息和数量对应更新商品库中的库存信息。)

1103
来自专栏无题

分库分表基本思想和实施策略

本文着重介绍sharding的基本思想和理论上的切分策略 参考地址:http://blog.csdn.net/bluishglc/article/details...

4286
来自专栏企鹅号快讯

从网站结构出发,提升搜索引擎的友好度

搜索引擎爬取网站内容都是从网站的结构出发,为了提升搜索引擎的友好的,优化网站结构是重点。和对待用户一样,对待搜索引擎也需要投其所好,才能获取它的友好度。 ? 1...

2216
来自专栏Android 开发者

Android P 开发者预览版首发!

2452
来自专栏顶级程序员

2016年你应该学习的语言和框架

2015年,软件开发界发生了很多变化。有很多流行的新语言发布了,也有很多重要的框架和工具发布了新版本。下面有一个我们觉得最重要的简短清单,同时也有我们觉得值得你...

39614
来自专栏知晓程序

如何在微信群里发通知?这个方法特别好用

今天,「知晓程序」推荐的小程序「群里有事」,也许能解决这个问题。在这里,你不仅可以发布通知、活动,而且它有一种强大的魔力,吸引大家去查看。

1301
来自专栏用户2442861的专栏

前端工程——基础篇

https://github.com/fouber/blog/issues/10#issuecomment-271133674

1052
来自专栏腾讯云技术沙龙

杨春文:小程序在直播产品中的技术应用

我是腾讯的杨春文,老东家在百度,目前在深圳腾讯,做的主要产品是web相关。我本身做NOW直播,所以会讲基于腾讯云的直播小程序,然后是小程序终端开发,总结一些经验...

88713

扫码关注云+社区

领取腾讯云代金券