1. 程式人生 > 其它 >ddia 第四章 資料編碼與演化

ddia 第四章 資料編碼與演化

ddia chapter 4.

隨著應用程式的升級,系統需要保持向後相容(新程式碼讀舊資料)和向前相容(舊程式碼讀新資料).資料的編碼支援更好的相容性尤為重要.

編碼資料

序列化: 將記憶體中的資料編碼成位元組序列(才能通過網路傳送)
反序列化: 將位元組序列解碼成記憶體中的資料

程式語言特定的編碼

特定的程式語言內建了序列化的方法,例如java.io.Serializablepickle,但是卻與語言緊密相關,其他語言難以讀取.
除非臨時使用,採用語言內建編碼通常是一個壞主意。

JSON XML和二進位制變體

通常流行使用的編碼有JSON/XMLCSV.
二進位制版本的JSON(BJSON等)和XML(WBXML)可以節省更多的空間.類似的還有Thrift

Protocol Buffers.
ThriftProtocal Buffers如何保證資料的相容?

編碼的記錄是編碼欄位的拼接.欄位在IDL中由標籤號碼標識.即使更改欄位名稱,只要不更改標籤號碼,編碼的資料就不會變更(編碼的資料不會引用欄位名稱).如果新增了欄位(使用新的標籤號碼),舊程式碼可以忽略該不能識別的欄位 (新增的欄位必須是可選的或者具有預設值),因此保證了向前相容.而新程式碼仍然可以讀取舊資料.刪除欄位也只能刪除非必填欄位.

還有一種適用於HadoopAvro,因為不包含欄位標籤號,對動態生成的模式更加友好.如何保證資料的相容?
它的IDL包含寫模式(編碼到程式中, writer

)和讀模式(程式解碼, reader).只需要根據正確的IDL中的順序進行解析,就可以正確解碼.只要寫模式和讀模式是相容的,Avro可以通過檢視寫模式和讀模式的定義進行轉換(根據欄位名匹配),所以這兩者不必完全相同.
reader如何知道資料是採用哪個writer的模式編碼的:

  • 大檔案情況下只要在每個檔案開頭包含一次作者模式.
  • 獨立資料庫可以儲存作者模式版本號,解碼時提取對應的作者模式.
  • 通過網路連線協商版本.

資料流--編碼資料在儲存與通訊場景的應用

將編碼好的資料從一個程序流向另一個程序,常見的方式如下,他們也有處理資料相容的方式:

  • 資料庫:資料演化可以通過給資料庫增加具有預設值的欄位,比進行資料重寫(遷移)更有效率.
  • RESTRPC: 取決於所採用的具體編碼技術.在必要時維護多個版本的API,REST可以在URL中使用版本號
  • 非同步訊息傳遞:訊息佇列(不需要強制特定資料模型,通常只是包含元資料的位元組序列)和Actor框架