php小編小新在這篇文章中將為大家介紹Kafka架構註冊表中的一個重要概念:代理程式。在Kafka中,代理程式是一種核心元件,負責管理和處理訊息流。然而,代理無法驗證記錄,這意味著一旦記錄被寫入代理,就無法再進行驗證和更改。這個特性可能會對一些特定的使用情境和安全性產生影響,因此在使用Kafka時需要注意這一點。接下來,我們將詳細解析代理無法驗證記錄的原因以及可能引發的問題。
我正在使用 Kafka 架構註冊表驗證架構。問題是,即使我輸入了正確的架構,我仍然收到錯誤 Broker: Broker failed to verify record.
#confluence.value.schema.validation 設定為 true,以便可以在目前代理程式層級檢查值的架構。
我設定的架構和我發送的資料如下。
{ "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "description": "Sample schema to help you get started.", "properties": { "test": { "type": "string" } }, "title": "schema_test", "type": "object" }
{"test": "test1"}
另外,我使用go發送數據,數據的程式碼如下。
// main
func main() {
kafka.ProduceData("schema_test", []byte(`{"test": "test1"}`))
}
<code>// kafka func ProduceData(topic string, data []byte) { conf := ReadConfig() p, err := kafka.NewProducer(&conf) if err != nil { fmt.Printf("Failed to create producer: %s", err) os.Exit(1) } defer p.Close() // Go-routine to handle message delivery reports and // possibly other event types (errors, stats, etc) go func() { for e := range p.Events() { switch ev := e.(type) { case *kafka.Message: if ev.TopicPartition.Error != nil { fmt.Printf("Failed to deliver message: %v\n", ev.TopicPartition) } else { fmt.Printf("Produced event to topic %s: key = %-10s value = %s\n", *ev.TopicPartition.Topic, string(ev.Key), string(ev.Value)) } } } }() p.Produce(&kafka.Message{ TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny}, Value: data, }, nil) // Wait for all messages to be delivered p.Flush(15 * 1000) } </code>
#對於經紀人如何實際驗證資料似乎存在誤解。它按預期工作。您需要一個架構 ID。您只是發送有關主題的純 JSON,沒有 ID。註冊表上的架構並不重要,重要的是它的 ID。
來自文件
更具體地說,您添加到註冊表的模式只是主題上可能存在的許多「版本」之一(例如 topic-value
)。每個版本都有一個唯一的 ID。驗證不僅僅使用最新版本;該 ID 在客戶端進行編碼。
請參閱使用 JSON 模式進行產生的 Confluence 範例(它本身應該進行記錄驗證)。
代理端驗證只是為了防止錯誤序列化的資料或“毒丸”,正如您現在所做的那樣。
以上是Kafka 架構註冊表 - 代理程式:代理程式無法驗證記錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!