使用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" } |
相關文章
- CPU處理器架構架構
- 處理器架構和配置架構
- MPP架構和批處理架構
- 盤點.NET支援的 處理器架構架構
- MIPS 架構流水線處理器架構
- 處理器指令集架構的位數架構
- Tomcat總體架構,啟動流程與處理請求流程Tomcat架構
- GPU 架構是圖形處理器GPU架構
- 使用Azure Functions和AWS Lambda處理資料的無伺服器架構Function伺服器架構
- 架構設計之架構的演變架構
- win10網路卡驅動不相容怎麼處理_win10與網路卡驅動不相容解決方法Win10
- 使用Spring Data等高階持久框架在乾淨架構下如何處理?Spring框架架構
- HttpServer伺服器命令處理通訊架構HTTPServer伺服器架構
- Cloud Foundry架構和訊息處理機制Cloud架構
- 處理器核、Core、處理器、CPU區別&&指令集架構與微架構的區別&&32位與64位指令集架構說明架構
- Apache Avro & Avro Schema簡介ApacheVR
- 設計信創雲架構,如何處理傳統雲架構存與棄的問題?架構
- Kappa:比Lambda更好更靈活的實時處理架構APP架構
- Android架構元件:用ViewModelCommandLiveData處理ViewModel中的事件釋出Android架構元件ViewLiveData事件
- thinkphp 輸出變數使用函式處理PHP變數函式
- Flink流處理的演變
- MPP大規模並行處理架構詳解並行架構
- AMDZen架構雙路處理器曝光很強大架構
- DBus資料庫表結構變更處理方案資料庫
- 大資料平臺之大資料處理系統的架構大資料架構
- 基於 Serverless 架構的頭像漫畫風處理小程式Server架構
- EMQ「邊緣-工廠-雲」異常事件告警處理架構MQ事件架構
- 爬蟲架構|利用Kafka處理資料推送問題(2)爬蟲架構Kafka
- 【細品架構10/100】架構由術至道的轉變(1)架構
- 【細品架構11/100】架構由術至道的轉變(2)架構
- win10系統與CAD不相容怎麼處理 cad與win10不相容的解決步驟Win10
- vmwre與win10提示版本不相容怎麼辦_win10系統不相容vmwre的處理方法Win10
- 系統架構演變架構
- Fabric架構演變之路架構
- 銀行IT架構變遷史(金融IT基礎架構)架構
- 如何在MapReduce中使用Avro資料格式?VR
- 面向資料架構的雲演變架構
- 網路晶片架構的新改變晶片架構