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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章