使用Avro處理不相容的架構變動 - Elliot
Apache Avro有資料結構模式相容性的概念,它允許我們確定一個資料結構是否與一個或多個較早或較新的資料結構在某些相容性約束方面相容。我們可以有相容的變化,這必然意味著我們也可以有不相容的變化。
在這種情況下,我們可以做什麼來實現這些破壞性的變化,同時儘量減少對消費者的干擾,不管是流媒體還是批處理。
假設我們有一個業務需求,我們需要把一個包含複合全名的字串欄位,變成一個有記錄封裝的獨立名字元素的欄位。從字串到記錄的轉變顯然是一個狀態的變化。
當前狀態:
record Person { string name; // example: "Joan Smith" } |
最終的變化狀態:
record Person { Name name; } record Name { string first_name; // example: "Joan" string last_name; // example: "Smith" } |
第1步 - 新增一個預設值
你可以刪除有預設值的欄位,所以我們現在新增一個預設值,以便以後可以刪除該欄位。選擇一個預設值,這個預設值在消費者系統中沒有任何意義,以後可以用來識別這個欄位是廢棄的。繼續為你的消費者用資料填充該欄位。
record Person { string name = "<DEPRECATED>"; // example: "Joan Smith" } |
第2步 - 引入新的欄位(可能有一個預設值)
我們正在引入我們在最終狀態下想要的欄位。但是我們還不能使用所需的欄位名,因為它將被過載。
此外,對於FORWARDS或FORWARDS_TRANSITIVE以外的相容模式,我們必須提供一個預設值。
生產者應該用有效的資料來填充這兩個欄位--現有的和新的。現在向所有消費者傳達他們應該開始使用新欄位。
record Person { string name = "<DEPRECATED>"; // example: "Joan Smith" Name person_name = {"first_name":"<NOT_IN_USE>","last_name":"<NOT_IN_USE>"}; } record Name { string first_name; // example: "Joan" string last_name; // example: "Smith" } |
第3步 - 刪除舊欄位
因為我們的舊欄位有一個預設值,而且現在沒有消費者在使用它--我們現在可以刪除它。
record Person { Name person_name = {"first_name":"<NOT_IN_USE>","last_name":"<NOT_IN_USE>"}; } record Name { string first_name; // example: "Joan" string last_name; // example: "Smith" } |
第4步 - 刪除預設值
現在我們可以從新欄位中刪除預設值。請注意,這不適用於FORWARDS,因為該欄位可以在步驟2中宣告,而沒有預設值。
record Person { Name person_name; } record Name { string first_name; // example: "Joan" string last_name; // example: "Smith" } |
第5步 - 重新命名欄位
最後,我們可以通過提供一個帶有所需名稱的別名來有效地重新命名它。
record Person { @aliases(["name"]) Name person_name; } record Name { string first_name; // example: "Joan" string last_name; // example: "Smith" } |
相關文章
- avro處理hadoop上的小檔案VRHadoop
- CPU處理器架構架構
- Hadoop 中處理小檔案的方式, Avro應用HadoopVR
- MPP架構和批處理架構
- 處理器架構和配置架構
- 處理器架構劃分架構
- Scala + Akka 是處理架構的IaaS架構
- 盤點.NET支援的 處理器架構架構
- 處理器架構資源整理架構
- 圖片上傳處理架構架構
- cqrs架構中,使用者登陸如何處理啊架構
- 處理器指令集架構的位數架構
- MIPS 架構流水線處理器架構
- GPU 架構是圖形處理器GPU架構
- Tomcat總體架構,啟動流程與處理請求流程Tomcat架構
- 架構設計之架構的演變架構
- 使用Azure Functions和AWS Lambda處理資料的無伺服器架構Function伺服器架構
- 海量資料處理_表結構變更
- win10網路卡驅動不相容怎麼處理_win10與網路卡驅動不相容解決方法Win10
- Apache Avro & Avro Schema簡介ApacheVR
- Cloud Foundry架構和訊息處理機制Cloud架構
- 處理器核、Core、處理器、CPU區別&&指令集架構與微架構的區別&&32位與64位指令集架構說明架構
- 網站架構及架構演變網站架構
- 設計信創雲架構,如何處理傳統雲架構存與棄的問題?架構
- 基於AWS雲服務的批處理系統架構架構
- 使用Spring Data等高階持久框架在乾淨架構下如何處理?Spring框架架構
- MPP大規模並行處理架構詳解並行架構
- HttpServer伺服器命令處理通訊架構HTTPServer伺服器架構
- AMDZen架構雙路處理器曝光很強大架構
- thinkphp 輸出變數使用函式處理PHP變數函式
- 異常處理流程(不相容SQLServer2005)SQLServer
- DBus資料庫表結構變更處理方案資料庫
- (譯)使用CoordinatorLayout處理滾動
- Kappa:比Lambda更好更靈活的實時處理架構APP架構
- 基於 Serverless 架構的頭像漫畫風處理小程式Server架構
- 大資料平臺之大資料處理系統的架構大資料架構
- 實時處理日均50億會話,解析Twitter Answers的架構會話架構
- Flink流處理的演變