嘿,StackOverflow 社區,
我有一個關于嵌套 Avro 模式的問題,以及在將它們與 Kafka 一起使用時如何將它們存盤在模式注冊表中的最佳實踐是什么。
TL;DR & 問題:在 Avro 模式注冊表中存盤復雜的嵌套型別的最佳實踐是什么?
- a)所有子型別作為一個單獨的主題(如下所示)
- b)嵌套超型別作為單個主題,包含所有子型別
- c)完全不同的東西?
一點背景關系:我們的模式由一個主型別組成,該型別具有一些復雜的子型別(其中一些子型別本身具有子型別)。為了保持整潔,我們將每個復雜型別都移到了自己的*.avsc檔案中。這給我們留下了大約 10 個*.avsc檔案。我們產生的所有訊息都有主型別,子型別從不單獨發送。為了上傳/注冊模式,我們使用了gradle 插件。為了讓它起作用,我們需要將每個子型別完全指定為一個單獨的主題,然后定義它們之間的參考,像這樣(在build.gradle.kts):
schemaRegistry {
url.set("https://$schemaRegistryPath")
register {
subject("SubSubType1", "$projectDir/src/main/avro/SubSubType1.avsc", "AVRO")
subject("SubType1", "$projectDir/src/main/avro/SubType1.avsc", "AVRO")
.addReference("SubSubType1","SubSubType1",-1)
subject("MyMainType", "$projectDir/src/main/avro/MyMainType.avsc", "AVRO")
.addReference("SubType1","SubSubType1",-1)
// remaining config omitted for brevity
}
}
這導致所有子型別在模式注冊表中注冊為單獨的主題:
curl -X GET http://schema-registry:8085/subjects
["MyMainType","Subtype1","Subtype2","Subtype3","SubSubType1","SubSubType2"]%
這感覺很尷尬;我們只生成有效負載為的 Kafka 訊息MyMainType- 因此我只需要在注冊表中擁有該型別,所有子型別都嵌套在其中,如下所示:
curl -X GET http://schema-registry:8085/subjects
["MyMainType"]%
對于這個特定的 Gradle 插件,這似乎是不可能的,但看起來其他插件處理這個問題是一樣的。顯然,當在單獨的檔案中指定 Avro 子型別時,注冊它們的唯一方法是將它們注冊為單獨的主題。
我應該在這里做什么?注冊所有子型別,還是將所有子型別合并*.avsc到一個大檔案中?
感謝大家的指點!
uj5u.com熱心網友回復:
不幸的是,似乎沒有關于這個主題的大量資訊,但這是我發現的關于復雜 Avro 模式選項的資訊:
- 對于具有少量復雜型別的簡單模式,請使用 Avro Schemas (
*.avsc) - 對于更復雜的模式和嵌套負載,請使用 Avro Interface Definitions (
*.avdl) - 這些本機支持匯入
因此,將定義轉換為*.avdl. 如果您堅持保留*.avsc樣式定義,可以使用 Maven 插件來合并這些(參見https://michalklempa.com/2020/04/composing-avro-schemas-from-subtypes/)。
然而,我得到的印象是,每當事情變得復雜時,最好使用 Avro IDL。這篇博文支持了這個假設。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/364742.html
