Netflix推出Hollow,處理內存數據集的Java庫

JoCorlette 7年前發布 | 11K 次閱讀 Java 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

 

 本文由用戶 JoCorlette 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!