写点什么

Gutenberg:Netflix 推出的一项数据集发布订阅服务

  • 2019-11-26
  • 本文字数:1359 字

    阅读完需:约 4 分钟

Gutenberg:Netflix推出的一项数据集发布订阅服务

为了将数据集从单个生产者传播到多个消费者,Netflix 创建了 Gutenberg 服务,它使用发布/订阅技术在微服务之间传播版本化的数据集——消费者订阅数据集,并在有新版本可用时更新数据集。Netflix 公司高级软件工程师Ammar Khaku在一篇博文中介绍了 Gutenberg 的总体设计以及一些用例。


在 Gutenberg 的数据模型中,顶层结构是主题。发布到主题将创建一个新的版本单调递增的数据模型,其中每个版本都包含元数据和一个数据指针。目前,Gutenberg 支持两种类型的数据指针:一种是数据编码在指针中,当数据集小于 1MB 时使用,另一种是指向AWS,数据存储在S3中,用于更大的数据集。


Gutenberg 的一个常见用例是从单个发布者向多个消费者传播各种大小的数据。通常,这些用例处理的配置情况是数据保存在客户端的内存中并在运行时中使用。示例包括支持支付方法的元数据和 A/B 测试配置。


另一个用例是版本化的数据存储,通常用于机器学习应用程序。团队根据历史数据构建和训练模型,运行一段时间以了解其效果,然后修改一些参数并再次运行。


Khaku 强调,Gutenberg 并不没有被设计成一个事件系统。它是为发布和消费整个数据集的不可变视图而设计的,纯粹用于数据版本控制和传播。快速发布新数据并不意味着客户端将读取所有版本。当客户端请求更新时,Gutenberg 将只提供最新版本的数据,而不提供任何以前的版本。


Gutenberg 包含一个提供 gRPC 和 REST API 的服务,以及一个使用 gRPC API 的 Java 客户端库。服务器基于一个全局复制的持久化Cassandra集群,有单独的实例组分别用于处理消费者请求和发布请求。这样就可以单独扩展,消费者请求可以比发布请求多许多,并且这两种请求类型可以互不影响。


为了处理来自消费者的大量请求,每个处理消费者请求的实例都有一个最新发布内容的内存缓存,缓存每隔几秒钟更新一次。为了防止行为不端的应用程序干扰系统,它们使用自适应并发限制器来检测和限制应用程序或服务。当使用多个区域中的 S3 桶时,服务器会设法进行优化,向客户端提供与客户端距离最近的区域中的桶。


在将数据返回给消费者之前,Gutenberg 服务首先对数据进行一致性检查。如果检查失败,服务将检查所请求主题的历史记录,并返回最新的一致数据。这是为了防止不完整的数据返回给消费者,因为 Cassandra 层有时会发生复制延迟。


Gutenberg 客户端库使用 gRPC 与 Gutenberg 服务通信,并使用Eureka进行服务发现。客户端的主要职责是管理订阅和 S3 上传/下载。当用户创建订阅并开始下载时,客户端库将开始通过每 30 秒一次的轮询来检索数据,然后将数据交给用户提供的监听器。它提供了不同类型的可配置的重试逻辑,使客户端能够根据需要处理下载问题。通常情况下,客户端总是会请求它所知道的最新版本的数据,并且只使用该版本的数据。一个例外是部署不当;为了快速缓解这种问题,可以要求客户端读取已知正确的特定版本的数据。


为了实现审计和使用情况的可见性,Gutenberg 服务拦截来自发布者和消费者的请求,并在Elasticsearch中为它们建立索引。这将创建一个视图,其中包含不同主题的使用情况和未使用的主题。


Gutenberg 的开发工作还在进行当中,正按计划增加一些新特性,包括Node.jsPython客户端支持、敏感数据加密以及改进增量发布。


原文链接:


Gutenberg – A Publish-Subscribe Service for Datasets Created by Netflix


2019-11-26 08:001748

评论

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

如何实现微信8.0爆炸和烟花表情特效

梅芳姑

NAC公链主打应用而生的NA(Nirvana)公链有什么过人之处?

区块链第一资讯

短视频编辑:基于ExoPlayer可实时交互的播放器

梅芳姑

定义边缘计算架构需考虑的三个方面

浪潮云

边缘计算

CMS前世今生

叫练

CMS JVM 垃圾收集

Python基础之:Python中的类

程序那些事

Python Python3 程序那些事

百度智能云发布云智一体的AI开发全栈模式

百度大脑

百度智能云

OpenTelemetry 简析

阿里巴巴云原生

容器 开发者 云原生 k8s 监控

自己搭建一个语音聊天室

anyRTC开发者

ios android 音视频 WebRTC RTC

Netty HashedWheelTimer 时间轮源码详解

Yano

Java 架构 Netty

今天是个开心的日子

return

2021年Android工作或更难找,原理+实战+视频+源码

欢喜学安卓

android 程序员 面试 移动开发

2021年Android面经分享,赶紧收藏!

欢喜学安卓

android 程序员 面试 移动开发

程序员面试指北:如何更高效的准备面试

邴越

Java 面试 求职 招聘

Hexo + Material + Github 搭建博客

U2647

博客 4月日更

ElasticSearch读写模型&数据复制模型

yhh

elasticsearch 数据复制模型

Python OpenCV 之图像乘除与像素的逻辑运算,图像处理取经之旅第 17 天

梦想橡皮擦

Python OpenCV 4月日更

Serverless 可观测性的过去、现在与未来

阿里巴巴云原生

Serverless 容器 开发者 云原生 调度

SCF—BSS3.0的“公路网”

鲸品堂

工具 框架搭建 流式计算框架

8x Flow 业务建模法(一):你能分清业务和领域吗?

胡皓

领域驱动设计 DDD 架构设计 事件风暴 业务建模

【leetcode题目】2. 两数相加

程序员架构进阶

LeetCode 28天写作 算法解析 4月日更

飞桨与龙芯完成兼容性认证

百度大脑

飞桨

MySql数据库列表数据分页查询、全文检索API零代码实现

crudapi

全文检索 API crud crudapi 列表查询

Kubernetes 稳定性保障手册 -- 可观测性专题

阿里巴巴云原生

Serverless 容器 云原生 k8s 存储

业务随行:用户的网络访问策略还能这么玩

华为云开发者联盟

网络 通信 安全组 IP地址 业务随行

uni-app对接金山文档在线预览服务

薛定喵君

Rust从0到1-所有权-引用和借用

rust 引用 所有权 借用

在npm发布自己的组件

空城机

JavaScript 大前端 npm 4月日更 自定义组件

实时数据仓库的发展、架构和趋势

网易数帆

数据仓库 实时计算 实时数仓 iceberg 批流一体

清明节特辑 |记忆存储、声音还原、性格模仿……AI可以让人类永生吗?

华为云开发者联盟

AI 语音合成 清明节 对话机器人 VR/AR

【LeetCode】直方图的水量Java题解

Albert

算法 LeetCode 4月日更

Gutenberg:Netflix推出的一项数据集发布订阅服务_软件工程_Jan Stenberg_InfoQ精选文章