BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Netflix推出Hollow,处理内存数据集的Java库

| 作者 Michael Redlich 关注 15 他的粉丝 ,译者 刘嘉洋 关注 0 他的粉丝 发布于 2017年2月8日. 估计阅读时间: 8 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

Netflix最近推出了Hollow,一款Java库和工具包,旨在有效缓存不属于“大数据”的数据集。这些数据集可能是电子商务和搜索引擎的元数据,或者是Netflix电影和电视节目的元数据。处理这种数据集的传统方法包括数据存储或串行化,但这可能会有可靠性和延迟问题。Hollow的入门指南中总结了核心概念和命名方法:

Hollow管理由单个生产者构建的数据集,并向一个或多个消费者传送以用于只读访问。数据集会随着时间而改变。改变的数据集的时间线可以分为离散的数据状态,每个状态都是那个特定时间点数据的完整快照。

生产者和消费者通过在数据状态之间转换的状态引擎来处理数据集。生产者使用写状态引擎,而消费者使用读状态引擎

Hollow取代了Netflix原先的内存数据集框架Zeno。数据集现在用紧凑的、固定长度的、强类型的数据编码表示。这种编码最小化了数据集占用的空间,并将编码记录“打包在JVM堆上合并的可重用内存条中,以避免影响繁忙的服务器上的GC行为。”

入门
要开始使用Hollow示例,请参考以下POJO:

public class Movie {
long id;
String title;
int releaseYear;

public Movie(long id,String title,int releaseYear) {
    this.id = id;
    this.title = title;
    this.releaseYear = releaseYear;
    }
}

上述POJO上简单的数据集可以这样填充:

List<Movie> movies = Arrays.asList(
new Movie(1,"The Matrix",1999),
new Movie(2,"Beasts of No Nation",2015),
new Movie(3,"Goodfellas",1990),
new Movie(4,"Inception",2010)
);

Hollow将这样的movies列表转换为新的编码形式,如下所示:

有关编码的更多详细信息,请参阅Hollow网站的高级主题章节

生产者
生产者的第一个示例发布了数据集(本例中的电影)的初始数据状态,并通知消费者在哪里找到该数据集。对数据集的后续更改会系统地发布并传送给消费者。

生产者使用HollowWriteStateEngine作为数据集的句柄:

HollowWriteStateEngine writeEngine = new HollowWriteStateEngine();

HollowObjectMapper填充HollowWriteStateEngine:

HollowObjectMapper objectMapper = new HollowObjectMapper(writeEngine);
for(Movie movie : movies) {
    objectMapper.addObject(movie);
    }

HollowObjectMapper是线程安全的,也可以并行执行。

生产者将数据集(也称blob)写入定义的输出流:

OutputStream os = new BufferedOutputStream(new FileOutputStream(snapshotFile));
HollowBlobWriter writer = new HollowBlobWriter(writeEngine);
writer.writeSnapshot(os);

为消费者生成API
客户端API基于数据模型生成必要的Java文件,并且必须在写入初始的消费者源代码前执行:

HollowAPIGenerator codeGenerator = new HollowAPIGenerator(
"MovieAPI", // a name for the API
"org.redlich.hollow.consumer.api.generated", // the path for generated API files
stateEngine); // the state engine
codeGenerator.generateFiles(apiCodeFolder);

消费者
一旦通知消费者已发布的数据集,消费者使用HollowWriteReadEngine作为数据集的句柄:

HollowReadStateEngine readEngine = new HollowReadStateEngine();

HollowBlobReader将blob从生产者消费到HollowReadStateEngine:

HollowBlobReader reader = new HollowBlobReader(readEngine);
InputStream is = new BufferedInputStream(new FileInputStream(snapshotFile));
reader.readSnapshot(is);

通过生成的API可以访问到数据集中的数据:

MovieAPI movieAPI = consumer.getAPI();
for(MovieHollow movie : movieAPI.getAllMovieHollow()) {
    System.out.println(movie._getId() + ", " +
    movie._getTitle()._getValue() + ", " +
    movie._getReleaseYear());
    }

这将打出结果输出:

1, "The Matrix", 1999
2, "Beasts of No Nation", 2015
3, "Goodfellas", 1990
4,"Inception", 2010

完整的Hollow项目可以在GitHub上找到。

InfoQ最近和Netflix高级软件工程师及Hollow主要贡献者Drew Koszewnik进行了详细的访谈,讨论了Hollow的具体实现细节。

查看英文原文Netflix Introduces Hollow, a Java Library for Processing In-Memory Datasets

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

翻译得好! by 孙 奇辉

对这类案例很感兴趣!

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT