2017-08-17 64 views
1

我想了解更多關於我們用於我們的卡夫卡話題的avro架構,我對此相對較新。我想知道是否有辦法在特定情況下演變架構。我們用一個新字段更新我們的模式不能爲空或任何默認值,因爲這些標識符都是這種類型。爲此我們所做的工作是創建新的主題,但有沒有更好的方法來演進現有的模式。謝謝。卡夫卡Avro架構演變

+1

去。如果新字段不能爲空,不能有一個默認值,你會想與所有不包含舊的記錄做那麼什麼這個領域?你想讓他們演變成新的模式嗎? –

+0

是的,但是我很好奇,是否有工作來解決這個問題而不創建新的主題。 –

回答

1

有主題的四個可能的兼容性: - Forward:等待着老版本的架構的客戶端可以讀取新版本 - Backward:這等待模式的新版本的客戶端可以讀取舊版本 - Both:以上 都 - None:上面這些都不是

考慮,有一些次,其中一些生產商將生產新老數據,以及消費者將只准新的或舊的數據。

如何在你的情況下表現客戶?

  • 添加一個字段總是向前兼容(老客戶剛落,新領域)
  • 只有當你指定一個默認值

而且它是向下兼容的,這是唯一真正的,如果你正在計劃將數據轉換爲特定模式(例如通過相應的POCO) - 如果您只是將其轉換爲json並進行自定義處理,則可以讓新客戶端處理兩種模式。

所以我買兩個possibe方式來wrte到同一個主題:

  • 您設置的默認值。你可能會誤解默認值,讀書缺乏 這個字段(可選)實例

    時,這並不意味着默認值將被寫入,但(報價Avro的規格)

    此字段的默認值,使用

例如,如果你以前有「名」,並要添加「姓」,你可以 集「姓」默認爲「NC」(或空),你可能已經在做一個數據庫。

  • 您可以設置您的兼容性默認爲none(或forward),這樣就可以更新您的模式(因爲默認情況下,comptibiliaty是backward)。在這種情況下,等待新模式的客戶端將無法處理舊數據。但是,如果您只處理傳入數據(更改兼容性,更新所有生產者(以便只有新數據將到達),那麼您的客戶端正在等待新模式 - 記住要將兼容性設置回落或兼容性確實適合您的使用要

我會選擇1

相關問題