我嘗試發佈/使用我的java對象給kafka。我使用Avro架構。如何從kafka收到的消息中獲取Avro模式對象?
我的基本程序工作正常。在我的程序中,我在生產者(用於編碼)和消費者(解碼)中使用我的模式。
如果我在接收器上發佈不同的對象給不同的主題(例如:100個主題),我不知道,我收到了什麼類型的消息?我想從接收到的字節中獲取avro模式,喜歡用它來解碼。 我的理解是否正確?如果是這樣,我如何從接收到的對象中檢索?
我嘗試發佈/使用我的java對象給kafka。我使用Avro架構。如何從kafka收到的消息中獲取Avro模式對象?
我的基本程序工作正常。在我的程序中,我在生產者(用於編碼)和消費者(解碼)中使用我的模式。
如果我在接收器上發佈不同的對象給不同的主題(例如:100個主題),我不知道,我收到了什麼類型的消息?我想從接收到的字節中獲取avro模式,喜歡用它來解碼。 我的理解是否正確?如果是這樣,我如何從接收到的對象中檢索?
您將不會收到接收字節中的Avro模式 - 而您並不真正想要。 Avro的全部想法是將模式從記錄中分離出來,因此它是一種更緊湊的格式。我這樣做,我有一個主題叫做Schema
。卡夫卡消費者過程所做的第一件事就是從一開始就聽這個話題,並解析所有的模式。
Avro模式只是JSON
字符串對象 - 您只能在Schema
主題中爲每個記錄存儲一個模式。
至於搞清楚哪些架構與話題去,我在a previous answer說,你希望每個主題一個模式,沒有更多的。所以當你解析一個特定主題的消息時,你確切知道應用了什麼模式,因爲只能有一個。
如果您從不重複使用該模式,則可以將模式命名爲與主題相同。但是,實際上,您可能會在多個主題上使用相同的模式。在這種情況下,您希望有一個將架構映射到主題的單獨主題。你可以創建一個Avro的模式是這樣的:
{"name":"SchemaMapping", "type":"record", "fields":[
{"name":"schemaName", "type":"string"},
{"name":"topicName", "type":"string"}
]}
你將公佈每個主題的單個記錄您的Avro的編碼映射到一個特殊的話題 - 比如所謂SchemaMapping
- 和消耗來自該Schema
話題後一開始,消費者會傾聽SchemaMapping
,之後它將確切地知道應爲每個主題應用哪個模式。
從我的理解中,你試圖圍繞Avro和Avro模式管理進行思考。我建議看一下https://github.com/confluentinc/schema-registry(其目的是爲了促進Avro和Kafka的整合)以及相應的文檔http://docs.confluent.io/current/ schema-registry/docs /和http://docs.confluent.io/current/app-development.html。 –