对于AvroProducer到Kafka," key"的avro架构在哪里?和"价值"?

时间:2017-04-28 00:55:53

标签: apache-kafka kafka-producer-api kafka-python

the confluent-kafka-python repo中的AvroProducer示例看来,键/值架构是从文件加载的。也就是说,从这段代码:

from confluent_kafka import avro 
from confluent_kafka.avro import AvroProducer

value_schema = avro.load('ValueSchema.avsc')
key_schema = avro.load('KeySchema.avsc')
value = {"name": "Value"}
key = {"name": "Key"}

avroProducer = AvroProducer({'bootstrap.servers': 'mybroker,mybroker2', 'schema.registry.url': 'http://schem_registry_host:port'}, default_key_schema=key_schema, default_value_schema=value_schema)
avroProducer.produce(topic='my_topic', value=value, key=key)

似乎文件ValueSchema.avscKeySchema.avsc的加载独立于Avro架构注册表。

这是对的吗?引用Avro架构注册表的URL的重点是什么,然后从磁盘加载架构以获取键/值?

请澄清。

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,最初不清楚本地文件的重点是什么。正如其他答案所述,对于第一次写入Avro主题或对主题架构的更新,您需要架构字符串 - 您可以从Kafka REST文档here中看到这一点。 / p>

在注册表中有架构后,您可以使用REST读取它(在本例中我使用了请求Python模块)并使用avro.loads()方法来获取它。我发现这很有用,因为produce()函数要求您具有AvroProducer的值模式,并且此代码将在没有该本地文件存在的情况下工作:

get_schema_req_data = requests.get("http://1.2.3.4:8081/subjects/sample_value_schema/versions/latest")
get_schema_req_data.raise_for_status()
schema_string = get_schema_req_data.json()['schema']
value_schema = avro.loads(schema_string)
avroProducer = AvroProducer({'bootstrap.servers': '1.2.3.4:9092', 'schema.registry.url': 'http://1.2.3.4:8081'}, default_value_schema=value_schema)
avroProducer.produce(topic='my_topic', value={"data" : "that matches your schema" })

希望这有帮助。

答案 1 :(得分:1)

这只是在Schema Registry中创建密钥和值模式的一种方法。您可以首先使用SR REST API在SR中创建它,也可以通过使用新消息发布SR中的现有模式的新模式或新版本来创建它。完全是您的选择,首选哪种方法。

答案 2 :(得分:0)

看看code并考虑消费者而不是生产者需要注册表中的模式。 MessageSerializer为您注册架构注册表中的架构:)