Netflix可扩展的数据注释服务


在Netflix,我们有数百个微型服务,每个都有自己的数据模型或实体。例如,我们有一个存储电影实体元数据的服务或一个存储图像元数据的服务。
所有这些服务在以后都想对他们的对象或实体进行注释。
我们的团队,资产管理平台,决定创建一个名为Marken的通用服务,允许Netflix的任何微服务注释他们的实体。

注释
有时人们把注释annotations 描述为标签,但这是一个有限的定义。在Marken中,注释是一块元数据,可以附加到任何领域的对象上。我们的客户应用程序想要生成的注释有很多不同的种类。

一个简单的注释,就像下面这样,将描述一部特定的电影有暴力:

  • ID为1234的电影实体有暴力。

但是还有更有趣的情况,用户想要存储时间性(基于时间的)数据或空间数据。
在下面的图1中,我们有一个应用程序的例子,它是由编辑用来审查他们的工作。他们想把手套的颜色改成浓黑色,所以他们希望能够在该区域做标记,在这种情况下使用一个蓝色的圆圈,并为它存储一个评论。这是一个典型的创意审查应用程序的用例。

存储基于时间和空间的数据的一个例子是一个ML算法,它可以识别一帧中的字符,并希望为一个视频存储以下内容

  • 在一个特定的框架(时间)内
  • 在图像的某些区域(空间)中
  • 一个字符名称(注释数据)。

Marken的目标
我们想创建一个注释服务,它将有以下目标:

  • 允许对任何实体进行注释。团队应该能够为注释定义他们的数据模型。
  • 注释可以被版本化。
  • 该服务应该能够为实时的,又称UI的应用提供服务,因此CRUD和搜索操作应该以低延迟实现。
  • 所有的数据也应该可以在Hive/Iceberg中进行离线分析。

shcema表结构
由于注释服务将由Netflix的任何人使用,我们需要为注释对象支持不同的数据模型。Marken中的数据模型可以用模式来描述--就像我们为数据库表创建shcema表结构一样。

我们的团队,资产管理平台,拥有一个不同的服务,有一个基于json的DSL来描述一个媒体资产的模式。我们对这个服务进行了扩展,以描述一个注释对象的结构模式:

{
      "type": "BOUNDING_BOX"
     
"version": 0, 
     
"description": "Schema describing a bounding box",
     
"keys": {
       
"properties": { 
         
"boundingBox": {
           
"type": "bounding_box",
           
"mandatory": true
          },
         
"boxTimeRange": {
             
"type": "time_range",
             
"mandatory": true
          }
      }
    }
}

在上述例子中,应用程序想在视频中表示一个跨越时间范围的矩形区域。

  • Schema的名称是BOUNDING_BOX
  • Schema可以有版本。这允许用户在他们的数据模型中添加/删除属性。我们不允许不兼容的改变,例如,用户不能改变一个属性的数据类型。
  • 存储的数据在 "属性 "部分表示。在这种情况下,有两个属性
  • boundingBox,类型为 "bounding_box"。这基本上是一个矩形区域。
  • boxTimeRange,类型为 "time_range"。这允许我们为这个注释指定开始和结束时间。

就像在面向对象编程中一样,我们的Schema服务允许模式相互继承。这允许我们的客户在Schema之间创建“是一种类型”的关系。与 Java 不同,我们也支持多重继承。
我们有多种 ML 算法可以扫描 Netflix 媒体资产(图像和视频)并创建非常有趣的数据,例如识别帧中的字符或识别匹配剪辑。然后,此数据将作为注释存储在我们的服务中。
作为一项平台服务,我们创建了一组基本模式,以简化为不同 ML 算法创建模式的过程。一种基本模式 (TEMPORAL_SPATIAL_BASE) 具有以下可选属性。此基本模式可由任何派生模式使用,而不限于 ML 算法。

  • Temporal(时间相关数据)
  • 空间(几何数据)

架构
鉴于服务的目标,我们必须时刻牢记。

  • 我们的服务将被许多内部 UI 应用程序使用,因此 CRUD 和搜索操作的延迟必须很低。
  • 除了应用程序,我们还将存储 ML 算法数据。其中一些数据可以在视频的帧级别上。因此存储的数据量可能很大。我们选择的数据库应该能够水平扩展。
  • 我们还预计该服务将具有高 RPS。

其他一些目标来自搜索需求。
  • 能够搜索时间和空间数据。
  • 能够按照我们的注释对象数据模型中的描述,使用不同的关联 ID 和附加关联 ID 进行搜索。
  • 在注释对象中的许多不同字段上进行全文搜索
  • 词干搜索支持

随着时间的推移,对搜索的要求只会增加,我们将在不同的部分详细讨论这些要求。
鉴于我们团队的要求和专业知识,我们决定选择 Cassandra 作为存储注释的真实来源。为了支持不同的搜索需求,我们选择了 ElasticSearch。除了支持各种功能,我们还有一堆内部辅助服务,例如。动物园管理员服务,国际化服务等。


Netflix 的关键举措之一:媒体搜索平台,现在使用 Marken 来存储注释并执行下面解释的各种搜索。我们的架构使从媒体算法中轻松加载和摄取数据成为可能。该数据被各种团队用于例如。宣传媒体(又名预告片、横幅图片)的创作者改进他们的工作流程。

更多点击标题