ddia 第四章 資料編碼與演化
阿新 • • 發佈:2021-08-15
ddia chapter 4.
與
)和讀模式(程式解碼,
隨著應用程式的升級,系統需要保持向後相容(新程式碼讀舊資料)和向前相容(舊程式碼讀新資料).資料的編碼支援更好的相容性尤為重要.
編碼資料
序列化: 將記憶體中的資料編碼成位元組序列(才能通過網路傳送)
反序列化: 將位元組序列解碼成記憶體中的資料
程式語言特定的編碼
特定的程式語言內建了序列化的方法,例如java.io.Serializable
和pickle
,但是卻與語言緊密相關,其他語言難以讀取.
除非臨時使用,採用語言內建編碼通常是一個壞主意。
JSON XML和二進位制變體
通常流行使用的編碼有JSON
/XML
和CSV
.
二進位制版本的JSON
(BJSON
等)和XML
(WBXML
)可以節省更多的空間.類似的還有Thrift
Protocol Buffers
.Thrift
與Protocal Buffers
如何保證資料的相容?
編碼的記錄是編碼欄位的拼接.欄位在
IDL
中由標籤號碼標識.即使更改欄位名稱,只要不更改標籤號碼,編碼的資料就不會變更(編碼的資料不會引用欄位名稱).如果新增了欄位(使用新的標籤號碼),舊程式碼可以忽略該不能識別的欄位 (新增的欄位必須是可選的或者具有預設值),因此保證了向前相容.而新程式碼仍然可以讀取舊資料.刪除欄位也只能刪除非必填欄位.
還有一種適用於Hadoop
的Avro
,因為不包含欄位標籤號,對動態生成的模式更加友好.如何保證資料的相容?
它的IDL
包含寫模式(編碼到程式中, writer
reader
).只需要根據正確的IDL
中的順序進行解析,就可以正確解碼.只要寫模式和讀模式是相容的,Avro
可以通過檢視寫模式和讀模式的定義進行轉換(根據欄位名匹配),所以這兩者不必完全相同.reader
如何知道資料是採用哪個writer
的模式編碼的:
- 大檔案情況下只要在每個檔案開頭包含一次作者模式.
- 獨立資料庫可以儲存作者模式版本號,解碼時提取對應的作者模式.
- 通過網路連線協商版本.
資料流--編碼資料在儲存與通訊場景的應用
將編碼好的資料從一個程序流向另一個程序,常見的方式如下,他們也有處理資料相容的方式:
- 資料庫:資料演化可以通過給資料庫增加具有預設值的欄位,比進行資料重寫(遷移)更有效率.
REST
與RPC
: 取決於所採用的具體編碼技術.在必要時維護多個版本的API
,REST
可以在URL
中使用版本號- 非同步訊息傳遞:訊息佇列(不需要強制特定資料模型,通常只是包含元資料的位元組序列)和
Actor
框架