資料序列化如何影響應用程式升級

在輪流應用程式升級中,系統會一次對一個升級網域,將升級套用至一部分節點。 在此過程中,有些升級域位於應用程式的較新版本,而有些升級域則位於應用程式的舊版本。 在部署期間,新版應用程式必須能讀取舊版資料,舊版應用程式必須能讀取新版資料。 如果資料格式不支援向前和向後相容,則升級可能會失敗,甚至資料可能會遺失或損壞。 本文將討論什麼構成你的資料格式,並提供確保資料前後相容的最佳實務。

你的資料格式是什麼?

在 Azure Service Fabric 中,持久化和複製的資料來自你的 C# 類別。 對於使用 Reliable Collection 的應用程式來說,這些資料就是 reliable 字典和佇列中的物件。 對於使用 Reliable Actors 的應用程式,那就是 Actor 的後備狀態。 這些 C# 類別必須可序列化,才能被持久化和複製。 因此,資料格式是由序列化的欄位和屬性,以及它們的序列化方式所定義。 例如,在IReliableDictionary<int, MyClass>中,資料是序列化的int和序列化的MyClass。

導致資料格式變更的程式碼變更

由於資料格式由 C# 類別決定,類別的變更可能導致資料格式的變更。 必須謹慎確保滾動升級能處理資料格式的變更。 可能導致資料格式變更的例子:

  • 新增或移除欄位或屬性
  • 重新命名欄位或屬性
  • 改變場類型或性質
  • 更改類別名稱或命名空間

資料合約作為預設序列化器

序列化器通常負責讀取資料並將其反序列化成目前版本,即使資料是舊版本或 新 版本。 預設的序列化器是 資料合約序列化器,擁有明確定義的版本控制規則。 Reliable Collections 允許覆寫序列化程式,但 Reliable Actors 目前不允許。 資料序列化器在實現滾動升級中扮演重要角色。 Data Contract 序列化器是我們推薦給 Service Fabric 應用的序列化器。

資料格式如何影響滾動升級

在滾動升級過程中,序列化器可能會遇到較舊或 較新 版本的資料,主要有兩種情況:

  1. 節點升級並重新啟動後,新的序列化器會載入由舊版本持續保存到磁碟的資料。
  2. 在升級過程中,叢集會包含你程式碼的舊版本與新版本混合。 由於副本可能被放置在不同的升級網域,且副本間會互相傳送資料,因此你的序列化器可能會遇到新的和/或舊版本的資料。

備註

這裡的「新版本」和「舊版本」指的是你正在執行的程式碼版本。 「新序列化器」指的是你應用程式新版本中執行的序列化程式程式碼。 「新資料」指的是你應用程式新版本中序列化的 C# 類別。

兩種版本的程式碼與資料格式必須同時具備向向與向後相容。 若不相容,滾動升級可能會失敗或資料遺失。 滾動升級可能會失敗,因為程式碼或串行器在遇到另一個版本時可能會拋出異常或錯誤。 例如,如果新增了某個屬性,但舊的序列化器在反序列化時丟棄了該屬性,資料可能會遺失。

Data Contract 是確保您的資料相容的推薦解決方案。 它有明確的版本管理規則,用於新增、移除和變更欄位。 它也支援處理未知欄位、銜接序列化與反序列化過程,以及類別繼承。 欲了解更多資訊,請參閱 使用資料合約。

下一步

使用 Visual Studio 升級你的應用程式 ,會引導你完成使用 Visual Studio 進行應用程式升級。

使用 PowerShell 升級應用程式 會引導你完成使用 PowerShell 進行應用程式升級。

透過升級參數來控制應用程式的升級方式。

透過參考 進階主題,學習如何在升級應用程式時使用進階功能。

請參考「 故障排除應用程式升級」中的步驟,以解決應用程式升級中的常見問題。