• 支撑Flickr能存储130亿张图片的Tripod架构详解
  • 阿汤哥 发表于 2017/2/21 12:39:00 | 分类标签: 架构设计 Flickr架构 Tripod
  • 最近在 Yahoo 官方的工程博客上,透露了最新的图片及视频底层平台 Tripod,雅虎如何在如此大的规模上对多媒体数据进行处理,存储和检索,对很多类似服务都有借鉴意义。Tripod的设计和实现也基于微服务这一流行架构理念,本文也对微服务系统常见的问题做了阐述。

    Flickr 传统的架构
    我根据早些年的资料,整理其架构大致如下。

    技术平台

    PHP
    •MySQL
    •Shards
    •Memcached 用作缓存
    •Squid 反向代理.
    •Linux (RedHat)
    •Smarty 模板
    •Perl
    •PEAR for XML and Email parsing
    •ImageMagick, 用于图片处理
    •Java, for the node service
    •Apache
    •SystemImager 用作发布
    •Ganglia 用于系统监控
    •Subcon 用作配置

    Flickr 的传统架构用现在的眼光看起来可能有些老旧,但在社交网络出来之前可是学习互联网架构的经典。

    然而到了社交网络时代,已经很长时间没有看到 Flickr 的架构更新说明了,上周 Yahoo 的工程博客上发表了其新的 Flickr 架构,我们来看看满足当前时代需要的新的图片及多媒体架构究竟是如何重新设计的。

    Flickr 新的 Tripod 架构

    今天,雅虎邮件引入了一个功能,允许自动同步手机照片到雅虎邮件,以便当您从写电子邮件的时候照片随时可用。这一功能背后的关键技术是新的图片和视频平台称为“Tripod”,这是出自 Flickr 团队的创新和能力。

    十几年来,Flickr 一直是世界上最大的照片共享社区之一,用户总共上传超过 130 亿张照片。Tripod 提供了一个很好的机会,把 Flickr 功能带到雅虎其他网络产品。

    Tripod 三大服务

    顾名思义,Tripod 提供三大服务:

    •存储及转码服务(Pixel Service):用于上传,存储,调整大小,修改照片和视频。

    •增强服务(Enrichment Service):用于图像识别算法完善媒体元数据。例如,算法可以识别和标记场景,动作和对象。

    •聚合服务(Aggregation Service):用于应用程序和跨应用程序元数据聚合,过滤和搜索。


    这三种服务的组合使得 Tripod 成为新一代图片服务平台。还有一个管理控制台,用于配置应用程序与Tripod的集成,以及身份服务,用于身份验证和授权。
    The Pixel Service

    Flickr 已经具有高可扩展性的照片上传和转码的流水线。在大规模处理海量照片和视频的情况下,Flickr 的移动和API团队调优相关技术(如断点上传和防重机制)以创建高品质的照片上传体验。Flickr 解决了优化存储而不影响照片质量的挑战,并添加了动态调整大小以支持更多样化的客户端照片布局的功能。

    多年以来,Flickr 团队已经证明可以支持每秒上传超过 500 张照片,完整的流水线包括 PHP
     上传接口,后端Java 服务(Image Daemon,Storage Master),美国西部和东部海岸的上传热点,以及五个全球照片缓存点以及大量 CDN。

    在 Tripod 的 Pixel 服务中,我们利用所有这些核心技术基础设施,除了新的 Java API,我们还实现了一个新的基于桶的数据模型。

    The Enrichment Service

    在 2013 年,Flickr 取得了令人兴奋的飞跃。雅虎收购了两家计算机视觉技术公司 IQ Engines 和 LookFlow,并将这些团队转到 Flickr。使用他们的图像识别算法,我们增强了 Flickr 搜索和 Flickr Magic View。

    在 Tripod 中,Enrichment 服务提供应用图像识别技术,产生丰富的元数据,可用于增强过滤,索引和搜索。Enrichment 服务可以识别地点,主题,地标,对象,颜色,文本,NSFW内容和最佳缩略图。它还执行 OCR 文本识别,并生成美学分数来指示照片的整体质量。

    The Aggregation Service

    Aggregation 服务允许应用程序(如Yahoo Mail)根据任何条件查找媒体。例如,它可以返回属于特定应用中的特定人的所有照片(例如,2015年3月1日之前的旧金山)

    Vespa 是 Yahoo 的内部搜索引擎,索引每个多媒体的元数据。如果已运行 Enrichment Service 过,则元数据被 Vespa 索引,并且可用于 Aggregation API。 调用 Aggregation 服务的结果集取决于读取权限。

    APIs and SDKs

    每个服务表示为一组 API。我们升级了 API 技术栈,从 PHP 切换到 Spring MVC,并利用最新的 Spring 特性,例如 Spring Data,Spring Boot 和 Spring Security 以及 OAuth 2.0。使用 Swagger (http://swagger.io/) 定义和记录 Tripod 的 API。每个服务都是从独立的 Git 存储库独立地开发和部署的,具有独立的构建生命周期和微服务容器。
    Swagger Editor 可以根据 Yahoo 开发人员的需要,轻松自动生成各种语言的 SDK。iOS 和 Android SDK 是移动开发最常用的,JS SDK 是 Web 常用的,通过 SDK 可以实现移动及 Web 端轻松与 Tripod 集成。

    Buckets and API Keys

    Tripod 数据模型与 Flickr 数据模型不尽相同。Tripod 应用程序,存储桶和 API  加入了多租户的概念,具有强大的访问控制能力。应用程序是 Tripod 服务的使用方,如 Yahoo Mail;存储桶是应用程序存储的逻辑容器,应用程序中的媒体(media)受到存储桶设置(例如压缩率,容量,TTL 生存时间以及其他选项)的影响。
    除了 Tripod 的通用属性,存储桶还可以由应用程序开发人员自定义组织属性。由 API key 控制对存储桶的读取/写入权限,生成的 OAuth 令牌对存储桶进行用户认证访问。
    开发人员使用 Tripod 控制台:

    •创建存储桶和 API key


    •定义每个 API key 的存储桶设置和访问控制规则


    与 Flickr API 的另一个不同的是 Tripod 可以处理非用户生成的内容(UGC)的媒体。这是许多 Yahoo 应用程序所要求的。

    架构和实现

    从单一架构到微服务架构面临很大挑战。特别是我们需要在服务之间找到合适的通信方式,其核心是我们的 Pulsar [1] 事件总线,我们通过总线发送 Avro 消息。这让每个 Tripod 团队迅速开发,而不会引入不兼容的更改。

    对于数据持久化,我们将大部分数据移动到雅虎的分布式 NoSQL 数据库 [2]。我们一直在试验使用 Redis Cluster 作为缓存层,并使用 Vespa 来驱动聚合服务。对于 Enrichment 服务,我们广泛使用 Storm 和 HBase 的实时处理 Tripod 的计算机视觉算法。最后,我们使用 PIG,Oozie 和 Hive 在雅虎基础大数据平台上运行大量的计算任务。

    在 2017 年,我们预计 Tripod 将占 Flickr 规模的 50%,Tripod 支持许多雅虎应用程序的多媒体需求,并且为移动和桌面版近 10 亿雅虎用户提供服务。

  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:阿汤哥
  • 加入时间:2013/5/15 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮