阅读更多

2顶
1踩

企业架构
原文:How Twitter Handles 3,000 Images Per Second
编译:孙薇
如今,Twitter每秒可以创建并保存3000张(20GB)的图片。2015年,Twitter甚至从对媒体存储策略的优化中节省出了600万美元。

但并非一开始就是这样的,2012年Twitter还主要是基于文本的,就像《哈利波特》中的霍格沃茨魔法学校没有了那些悬挂在墙上的炫酷活动照片一样。如今已经是2016年,Twitter已进入了富媒体未来时代。在新媒体平台发展的过程中,Twitter可以支持照片预览、多张照片、gif图、Vine短片以及在线视频。

Twitter的软件开发工程师Henna Kermani在Mobile @Scale London的谈话中提及,这个媒体平台每秒能够处理3000张图片。虽然这次谈话的主要话题是讨论图片管道,但她表示其中的大多细节也适用于其他的媒体类型。

这次谈话所总结的心得中,一些最有趣的内容摘录如下:
  • 按照可能奏效的最简单方式来执行,结果真的会让你大吃一惊: 发送一条带图片的推特是一个要么全有要么全无的操作,最简单的方式就是锁定。由于无法很好地扩展,尤其是网络状况不佳的情况下,Twitter很难再增加新功能。
  • 分离处理: 将发推与发送媒体分离,通过解耦的方式来处理,Twitter便可分别优化各个途径,同时还能大幅增进操作灵活性。
  • 移动handle(句柄),而不要移动blob(二进制大对象): 不要在系统中执行大块的数据移动,这样会消耗掉带宽,并导致接触到数据的各个服务有性能上的问题。请存储数据,并使用handle来引用。
  • 改用分段的、可恢复的上传操作能够大幅降低媒体上传的失败率。
  • 实验与研究: Twitter在研究中发现:将各类图片变体(缩略图、小图、大图等)的TTL(存活时间)设为20天可以让存储与计算达到最有效、最优秀的平衡。图片在20天之后的访问概率很低,删除后每天能节省下来的存储空间几乎有4TB——达到计算服务器需要数值的近乎一半,这样做之后每年能节省数百万美元。
  • 按需操作: 我们可以删除旧图片的变体,是因为它们能在瞬间完成重建,而无需预计算。根据需求来执行服务能够增加灵活性,并在任务执行的方式上更为智能,控制时也更集中化。
  • 渐进式JPEG(Progressive JPEG)是标准图片格式的真正优胜者:不但前端和后端对其支持都很优秀,在速度较慢的网络中,这类图片的效果也很好。
  • 在Twitter发展为富媒体未来的过程中,有许许多多好事发生,让我们来一一解读。

过去——2012年的Twitter
写入方式
用户在应用中编辑一条推文,或许再附上一张图片。

客户端将这条带图推文发送给单一整体式端点。上传时,推文中的图片和其他元数据是捆绑在一起,发送给过程中所涉及的单体服务的。

在旧式设计中,端点就是诸多问题产生的根源。

问题一: 浪费大量带宽

创建一条推文与上传媒体,两者在一个操作中紧密耦合。

上传的动作是一个整体,要么全部成功,要么全部失败。无论失败的原因是什么——网络临时中断、暂时出错等等,都需要将整个过程从头来过,包括要重新上传媒体。如果在上传到95%的时候出现故障而导致失败,就必须重新再次上传。

问题二: 对较大的新型媒体来说,缺乏良好的扩展

这种办法缺乏针对大型媒体,比如视频的扩展性。媒体越大,失败的可能性也越大,特别是在IT业的新兴市场,比如巴西、印度、印尼等地,由于网速慢、网络可靠性差,这个问题更加严重,确实很需要增加上传的成功率。
问题三: 内部带宽的使用效率低下

终端与TFE(Twitter前端)相连,而TFE则负责用户身份验证,并将用户分配到不同图片服务器(Image Service)。

图片服务器与图片变体生成器(Variant Generator )会话,并生成不同大小的图片实例(比如小图、中图、大图、缩略图)。图片变体存储在BlobStore中,这是一个针对类似图片和视频等大型有效载荷而优化的key-value存储系统,存储在其中的图片是永久性的。

创建及保存推文的过程中,还涉及了许多其他服务。由于终端是单一整体式的,媒体与推文的元数据结合在一起,也会流经所有的服务。这个大型有效载荷被发送给直接负责图片的服务,这些服务并不属于媒体管道,但仍被强制执行大型有效载荷的优化。这种办法在内部带宽中效率非常低。

问题四: 臃肿的存储空间

推文中的图片在数月或数年后已经不再会被调用了,但仍存于BloStore中占用空间。有时甚至在推文被删除后,图片仍存在于BlobStore中,缺乏垃圾回收机制。

读取方式
引入了名为MinaBird的CDN源服务器(Origin Server )。

  • MinaBird可以与ImageBird、VideoBird对话,因此如果没有的话,可以立即生成相应大小的图片及视频格式。
  • MinaBird在执行客户端请求时,更为动态也更为流畅。比如因为版权问题而需要将某个内容屏蔽,使用MinaBird可以很容易地对特定某条媒体执行屏蔽及恢复的操作。
  • 能够实时生成需求大小的图片与视频格式转码,Twitter在存储上的智能性也更高了。

按需生成要求的媒体变体意味着无需在BlobStore中存储所有的变体。这是一个巨大的胜利。

原始媒体直到删除前都存储在BlobStore中,而变体只保存20天。媒体平台团队做了很多关于最佳保存时限的研究,所有请求的图片中,大约50%只保存15天,按收益率递减结果,删除较早的图片。很旧的媒体很可能没有人会发起相应的请求,在15天后会有很长的长尾期。

如果不设定TTL(存活时间)和过期时间,每天增加的媒体存储量有6TB。懒办法就是按需生成所有媒体变体,导致媒体存储增长为1.5TB。20天TTL所使用的存储空间比懒办法多不了多少,因此不会占用太大的存储空间,但在计算上这是一个巨大的胜利。使用懒办法来计算,读取所有变体需要在每个数据中心设置150个ImageBird,而使用20天TTL的话,只需要75个ImageBird。因此20天TTL是令计算和存储达到最有效、最平衡的时间点。

由于节省存储空间和计算资源就是节省金钱,引入20天TTL之后,在2015年Twitter节省下了600万美元。

客户端优化(安卓)

在使用WebP(谷歌创建的一种图片格式)进行了6个月的实验之后,

这种图片比相应的PNG或JPEG图片要小25%。

这样一来,特别是在新兴市场,由于较小的图片对网络压力也较小,因而用户参与度也更高。

由于不支持iOS系统,并且只支持安卓4.0以上的系统,缺少平台的支持使得WebP格式花费巨大。

于是Twitter尝试了另一个选项,渐进式JPEG格式。由于通过连续扫描的形式来渲染,首次扫描可能是块状的,但在连续扫描的过程中会逐渐自我完善。

这种格式的性能更佳。

后端很容易支持。

这种格式比传统JPEG格式的编码速度慢了60%,由于一次编码,多次服务,因此这不算大问题。

渐进式JPEG图片不支持透明图片,因此保留了透明的PNG图片,除此之外其它都使用了渐进式JPEG。

客户端由Facebook的Fresco库提供支持,Fresco的优点很多。在2G网络下,效果令人印象深刻。第一次扫描PJPEG图片只用了10kb流量,因此加载时间不长,在本地管道还等待加载,什么都没显示的时候,PJPEG已经显示出了可识别的图像。

有正在进行的实现结果显示,负载细节如下:减少了9%的P50加载时间,减少了27%的P95加载时间,减少了74%的失败率,慢速连接的用户确实能获得极大改善。
2
1
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Twitter 架构优化之路--Twitter是如何做到每秒处理3000张图片的

    如今,Twitter每秒可以创建并保存3000张(20GB)的图片。2015年,Twitter甚至从对媒体存储策略的优化中节省出了600万美元。但并非一开始就是这样的,2012年Twitter还主要是基于文本的,就像《哈利波特》中的霍格沃茨...

  • Twitter 架构优化之路--Twitter是如何做到每秒处理3000张图片

    如今,Twitter每秒可以创建并保存3000张(20GB)的图片。2015年,Twitter甚至从对媒体存储策略的优化中节省出了600万美元。 但并非一开始就是这样的,2012年Twitter还主要是基于文本的,就像《哈利波特》中的...

  • Twitter实现每秒处理3000张图片的优化实践

    原文: How Twitter Handles 3,000 Images Per Second 编译: 孙薇 责编: 钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「CSDN 高级架构师群」...如今,Twitter每秒可以创建并...

  • Twitter实现每秒处理3000张(20G)图片的优化实践

    Twitter实现每秒处理3000张(20G)图片的优化实践 原文: How Twitter Handles 3,000 Images Per Second 编译: 孙薇 来源: CSDN,本文已收获授权转载。 如今,Twitter每秒可以创建并保存3000张(20GB)的...

  • python每秒并发2000个请求_用 Python 实现每秒百万级请求-阿里云开发者社区

    用 Python 可以每秒发出百万个请求吗?这个问题终于有了肯定的回答。许多公司抛弃 Python 拥抱其他语言就为了提高性能节约服务器成本。但是没必要啊。Python 也可以胜任。Python 社区近来针对性能做了很多优化。...

  • 用 Python 实现每秒处理 120 万次 HTTP 请求

    点击上方“程序员大咖”,选择“置顶公众号”关键时刻,第一时间送达!用 Python 做到每秒处理上百万次 HTTP 请求,可能吗?也许不能,但直到最近,这已成为现实。很多...

  • 图像处理知多少?准大厂算法工程师30+场秋招后总结的面经问题详解

    对于一些实时应用场景,如基于特征点匹配的实时目标跟踪系统,每秒要处理数十帧的图像,需要在毫秒级完成特征点的搜索定位、特征向量的生成、特征向量的匹配以及目标锁定等工作,SIFT特征很难满足这种需求。...

  • 用Python实现每秒处理120万次HTTP请求

    用 Python 做到每秒处理上百万次 HTTP 请求,可能吗?也许不能,但直到最近,这已成为现实。 很多公司都在为了提升程序的执行性能和降低服务器的运营成本,而放弃 Python 去选择其它编程语言,其实这样做并不是必须,...

  • Pixable的架构如何支持每天2000万张图片?

    不过,Pixable可以自动把你在Facebook和Twitter的图片抓取过来,每天新增图片达2000万张,他们是如何处理、保存、分析暴增的数据的呢?Pixable CTO Alberto Lopez Toledo和工程副总Julio Viera对P

  • Twitter Lite以及大规模的高性能React渐进式网络应用

    Twitter Lite以及大规模的高性能React渐进式网络应用 原文:Twitter Lite and High Performance React Progressive Web Apps at Scale 译者:neal1991 welcome to star my articles-translator , providing ...

  • 用 Python 实现每秒百万级请求

    本文讲的是用 Python 实现每秒百万级请求, 用 Python 可以每秒发出百万个请求吗?这个问题终于有了肯定的回答。 许多公司抛弃 Python 拥抱其他语言就为了提高性能节约服务器成本。但是没必要啊。Python 也可以...

  • 发表在IBM Developworks上的文章,Spark Streaming 图片处理案例介绍

    本文首先介绍了流式处理框架的设计原理、Spark Streaming 的工作原理,然后通过一个基于 Spark Streaming 编写的读取、分析、写入图片的示例帮助读者加深了解 Spark Streaming 的工作原理。

  • 梦断代码--一个程序员的自白 (一)

    本文谢绝转载 梦断代码--一个程序员的自白 (一)                                  --当一个有价值的人或事物逝去,缅怀他的人便为之立碑,写下墓志铭。 本文以此献给Protein。     看过一本同样叫做《梦断代码》的书,英文名叫《dream in code》 我总觉得翻译得不准确。 在那本书中,讲述了一个软件项目Chandler失败的前

  • 启用新的博客地址https://icerote.net/blog/

    转移到个人网站https://icerote.net/blog/。以后不会再到CSDN写blog了万一同步回来呢?。

  • 关于版权

    如果我买一本书,然后复印了几本送给朋友同事,没有人会起诉我。可是,为什么我买的软件就不能那么干?如果我买了一把菜刀,只要我愿意,我可以为他装上铁柄,并用来劈木头,刀具商人不会起诉我。软件就不可以:我不能反向工程,也不能修改!凭什么?我可以拿消毒柜当储藏柜使用,把自行车改装成助动车,该死的正版软件就不行!所以,我支持版权,但是,我无法同意版权保护,特别是眼下这种变态的版权保护,已经严重威胁到个人的自

  • 只言片语(二)

    春回节未尽,霜重开梅花。山带苍茫色,云归暮霭家。友来同赏酒,人去独品茶。何必悲红袖,丁香可自嘉。 人去了无期,投林归鸟疾。秋迟寒露重,花落香满衣。 已是黄花香满袖,小院正风凉。薄雾幽幽独倚窗,一曲诉衷肠。可叹佳人难再会,空自忆丁香。唱罢余音犹绕梁,云渐散,月如霜。

  • setting.xml文件,修改Maven仓库指向至阿里仓

    setting.xml文件,修改Maven仓库指向至阿里仓

  • 基于java的玉安农副产品销售系统的开题报告.docx

    基于java的玉安农副产品销售系统的开题报告

Global site tag (gtag.js) - Google Analytics