Netflix推出Hollow,處理內存數據集的Java庫
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列表轉換為新的編碼形式,如下所示:
生產者生產者的第一個示例發布了數據集(本例中的電影)的初始數據狀態,并通知消費者在哪里找到該數據集。對數據集的后續更改會系統地發布并傳送給消費者。
生產者使用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
來自:http://www.infoq.com/cn/news/2017/02/netflix-introduces-hollow