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

JoCorlette 8年前
   <p>Netflix最近 推出了Hollow ,一款Java库和工具包,旨在有效缓存不属于“大数据”的数据集。这些数据集可能是电子商务和搜索引擎的元数据,或者是Netflix电影和电视节目的元数据。处理这种数据集的传统方法包括数据存储或串行化,但这可能会有可靠性和延迟问题。Hollow的 入门指南 中总结了核心概念和命名方法:</p>    <p>Hollow管理由单个 <em>生产者</em> 构建的数据集,并向一个或多个 <em>消费者</em> 传送以用于只读访问。数据集会随着时间而改变。改变的数据集的时间线可以分为离散的 <em>数据状态</em> ,每个状态都是那个特定时间点数据的完整快照。</p>    <p>生产者和消费者通过在数据状态之间转换的 <em>状态引擎</em> 来处理数据集。生产者使用 <em>写状态引擎</em> ,而消费者使用 <em>读状态引擎</em> 。</p>    <p>Hollow取代了Netflix原先的内存数据集框架 Zeno 。数据集现在用紧凑的、固定长度的、强类型的数据编码表示。这种编码最小化了数据集占用的空间,并将编码记录“打包在JVM堆上合并的可重用内存条中,以避免影响繁忙的服务器上的GC行为。”</p>    <p>入门要开始使用Hollow示例,请参考以下POJO:</p>    <pre>  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;      }  }</pre>    <p>上述POJO上简单的数据集可以这样填充:</p>    <pre>  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)  );</pre>    <p>Hollow将这样的movies列表转换为新的编码形式,如下所示:</p>    <p><img src="https://simg.open-open.com/show/7c229e4c9cec1ee8c1208f75cd3c0d93.png"></p>    <p>生产者生产者的第一个示例发布了数据集(本例中的电影)的初始数据状态,并通知消费者在哪里找到该数据集。对数据集的后续更改会系统地发布并传送给消费者。</p>    <p>生产者使用HollowWriteStateEngine作为数据集的句柄:</p>    <pre>  HollowWriteStateEngine writeEngine = new HollowWriteStateEngine();</pre>    <p>HollowObjectMapper填充HollowWriteStateEngine:</p>    <pre>  HollowObjectMapper objectMapper = new HollowObjectMapper(writeEngine);  for(Movie movie : movies) {      objectMapper.addObject(movie);      }</pre>    <p>HollowObjectMapper是线程安全的,也可以并行执行。</p>    <p>生产者将数据集(也称blob)写入定义的输出流:</p>    <pre>  OutputStream os = new BufferedOutputStream(new FileOutputStream(snapshotFile));  HollowBlobWriter writer = new HollowBlobWriter(writeEngine);  writer.writeSnapshot(os);</pre>    <p>为消费者生成API客户端API基于数据模型生成必要的Java文件,并且必须在写入初始的消费者源代码前执行:</p>    <pre>  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);</pre>    <p>消费者一旦通知消费者已发布的数据集,消费者使用HollowWriteReadEngine作为数据集的句柄:</p>    <pre>  HollowReadStateEngine readEngine = new HollowReadStateEngine();</pre>    <p>HollowBlobReader将blob从生产者消费到HollowReadStateEngine:</p>    <pre>  HollowBlobReader reader = new HollowBlobReader(readEngine);  InputStream is = new BufferedInputStream(new FileInputStream(snapshotFile));  reader.readSnapshot(is);</pre>    <p>通过生成的API可以访问到数据集中的数据:</p>    <pre>  MovieAPI movieAPI = consumer.getAPI();  for(MovieHollow movie : movieAPI.getAllMovieHollow()) {      System.out.println(movie._getId() + ", " +      movie._getTitle()._getValue() + ", " +      movie._getReleaseYear());      }</pre>    <p>这将打出结果输出:</p>    <pre>  1, "The Matrix", 1999  2, "Beasts of No Nation", 2015  3, "Goodfellas", 1990  4,"Inception", 2010</pre>    <p> </p>    <p> </p>    <p>来自:http://www.infoq.com/cn/news/2017/02/netflix-introduces-hollow</p>    <p> </p>