写点什么

Imgix 技术栈解密:每秒可对外提供 10 万张图片

  • 2015-09-23
  • 本文字数:1678 字

    阅读完需:约 6 分钟

什么是 Imgix?

Imgix 是一项进行图像实时处理和传输的服务,授权给企业和开发者用以优化图像。借助简单的 URL API 接口,Imgix 可以实时抓取、传输图像,并通过 CDN 将图像提供到世界各地。个人用户在使用时可以无限量地动态生成图像,从而不必在本地储存大量的图像。图像剪裁、大小调整等动态调整过程防止了网页过于臃肿,保证了网站精炼简洁。

技术挑战
Imgix 拥有超过 80 个 URL 参数,这些参数用于调整复杂的图像处理效果。Imgix 可以调节压缩比和色度抽样率,进行色彩量化等操作。另外, Imgix 能够同时响应多个输入,输入图像的来源(浏览器、手机、平板电脑、显示器)也可不同。目前,影响图像输出结果的参数和输入的绝对数目仍在快速增长。

设计 Imgix 架构时的前提假设是,收到的图像请求不能被缓存,而且必须动态创建。这一点彻底改变了 Imgix 服务的提供方式和评判标准。多年来,Imgix 架构被反复修改,现在已经能够做到每秒处理超过 10 万个的图像,其中 90% 的输入文件大小大于 4.5MB。Imgix 用最快的速度、最少的成本提供了质量最好的图像。未来,Imgix 还希望把每秒处理的图像数量提高到 100 万个以上。

技术栈揭秘
Imgix 的核心架构由多个服务层组成,包括原图抓取层、原图缓存层、图像处理层、负载平衡及分配层、以及内容传输层。每个服务层都有遍布全局的配置、日志记录、监视及管理服务。

原图抓取层和缓存层使用了定制的 MogileFS nginx HAProxy 作为底层技术。负载平衡及分配层则基于自定义 C 代码和自主开发的 LuaJIT 框架(名称为 Levee)。Levee 能够在一台机器上每秒处理 4 万个请求。将以前的一些由 Python 处理的服务转为用 LuaJIT 框架处理后,性能提高了 20 倍。当技术成熟之后,Levee 还将开源。网络边界管理则同时使用了 HAProxy、nginx 和 OpenResty 。图像处理层的高性能图像处理服务器使用 C、 Objective-C 以及 Core Graphics 搭建。在 GPU 中的图像处理操作时间小于 1ms,提升性能的工作主要是对网络接口 / 本地内存的缓存到 GPU 纹理缓冲器这一步进行路径优化。由于图像完全契合 GPU 纹理缓冲器,点对点处理时间的范围小于 50ms。图像处理层的所有更改都将进行一系列回归分析测试,以保证每次更改不会对图像处理结果引入视觉可辨的差异。最后的内容传输层使用了 Fastly ,通过 Vanish 工具进一步优化了流量控制。全球 20 多个 Fastly POP 使得 Imgix 的用户可以快速获取图像。各个服务层之间的有序协作将 90% 首次抓取、未经缓存的图像在高峰时期的点对点响应时间缩短到了 700ms 以下。

Imgix 每个服务层的日志记录十分重要,因此需要建立全面的日志生成流水线。 Heka 用于处理大部分数据行集合,并将处理后的实时数据、统计数据、分析数据分别发送给 Riemann Hosted Graphite Google BigQuery

Imgix 管理和监控堆栈使用了几项开源项目: Ansible 用于配置管理, Consul 用于服务发现, Prometheus 用于网络监控, StatusPage.io 用于给用户报告架构当前的状态。

Imgix 网页的前端服务完全与核心架构隔离。页面搭建主要根据需求使用 Angular Ember Tornado ,这些工具提供了配置及管理 Imgix 账户的网页接口。Imgix 还分别为每一个前端项目的开发、测试、制作提供了 Docker 容器。另外还有 CircleCI 用于内部服务, Travis CI 用于管理开源项目和库。

Imgix 不断地整合集成,一天内常进行多次部署。Imgix 的开发使用 GitHub 管理每项服务的代码仓库,使用 Trello 作为团队规划管理工具。项目讨论在 Slack 群组聊天软件上进行,不过更多的时候,讨论直接就茶水间中完成了。

2013 年,苹果公司发布了更符合 Imgix 需求的硬件设备——Mac Pro。现在,Imgix 的数据中心用 46U 机柜搭建了 Mac Pro 图像处理节点群。这种机柜整合方式比起大多数基于 Linux 的解决方案,大大节约了占地面积,减少了耗电量。Imgix 宣称其从内而外都优于运行在 EC2 上的 ImageMagick。


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-09-23 19:004964
用户头像

发布了 268 篇内容, 共 133.3 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

JVM故障诊断和处理工具

Silently9527

Java JVM jvm调优

CSS14 - 元素可见性

Mr.Cactus

html/css

大小公司产品经理岗位对比

Kr

Python 循环语句

赵开忠

28天写作

Flutter技术在会展云中大显身手

京东科技开发者

小程序flutter, 跨平台 云服务 移动开发

1月|日更挑战活动说明

InfoQ写作社区官方

七日更 热门活动

我给职场新人提个建议

石云升

创业 28天写作 职场新人

LeetCode题解:105. 从前序与中序遍历序列构造二叉树,递归+使用索引,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

网络故障排除工具,你用过哪些?

2020 全球 JS 调查报告新鲜出炉

蓝色的秋风

typescript Vue 大前端 React React Native

贸易战的本质是什么?

JiangX

经济 28天写作 制造 美国 贸易战

日语复习Day01【~あげく(に)】

IT蜗壳-Tango

程序员 七日更 日语语法 情景句型

Mysql报表下载为什么出现了重复的数据?

三石

MySQL性能优化 28天写作 mysql重复数据

「大厂攻略」打开线程 | 进程 | 协程的大门

我是程序员小贱

面试 操作系统

面试官:你说一下对Java中的volatile的理解吧

Java 编程 面试 多线程

京东RPA:以企业数字化转型为驱动的机器人流程自动化解决方案专家

京东科技开发者

RPA 企业信息化 数字化运维

最近很火的京东、天猫超市飞天茅台抢购是怎么回事,从原理流程给你们分析一波

谙忆

MySQL查询——连接查询

程序员的时光

程序员 28天写作

甲方日常 85

句子

工作 随笔杂谈 日常

大厂面试题:你知道JUC中的Semaphore、CyclicBarrier、CountDownLatch吗

Java鱼仔

Java 面试 并发 JUC

智能building之二 智能单体建筑

张老蔫

28天写作

谈谈SpringFramework与IoC依赖查找

Java架构师迁哥

精选算法面试-数组II

李孟聊AI

面试 算法 数组 28天写作

CSS15 - 界面样式&垂直对齐

Mr.Cactus

html/css

如何使用maven 轻松重构项目

田维常

maven

创业失败启示录|校园微生活之快叫外卖

阿萌

28天写作 创业失败启示录 青城

读书笔记:《激荡三十年》上

lidaobing

28天写作 激荡三十年

大厂面试官竟然这么爱问Kafka,一连八个Kafka问题把我问蒙了

五分钟学大数据

大数据 kafka

我们设计的是微服务还是小单体应用

xcbeyond

微服务 方法论 DDD 28天写作

28 天带你玩转 Kubernetes-- 第七天(玩转 Dockerfile)

Java全栈封神

Docker Kubernetes k8s Dockerfile 28天写作

夜莺二次开发指南系列

ning

开源 监控 滴滴夜莺 夜莺监控 运维平台

Imgix技术栈解密:每秒可对外提供10万张图片_语言 & 开发_张天雷_InfoQ精选文章