要生成Kafka Avro消息而不使用模式注册表URL,可以在使用Avro序列化程序时手动指定模式,然后将该模式用于消息序列化。下面是一个示例:
from io import BytesIO
from confluent_kafka import avro
from confluent_kafka.avro import AvroProducer
from avro.io import DatumWriter
# 用于手动指定Avro模式的字符串
SCHEMA_STR = """
{
"name": "UserInfo",
"type": "record",
"fields": [
{"name": "name", "type": "string"},
{"name": "age", "type": "int"}
]
}
"""
# 将字符串转换为模式对象
SCHEMA = avro.loads(SCHEMA_STR)
# 创建一个AvroProducer实例并手动指定模式
producer = AvroProducer({
'bootstrap.servers': 'localhost:9092',
'schema.registry.url': 'http://localhost:8081'
},
value_schema=SCHEMA)
# 创建待序列化的记录
record = {"name": "Alice", "age": 30}
# 创建一个写入器对象
buf = BytesIO()
writer = DatumWriter(SCHEMA)
# 将记录序列化到缓冲区
writer.write(record, avro.io.BinaryEncoder(buf))
buf.seek(0)
# 将缓冲区中的字节流发送到Kafka
producer.produce(topic='user-info', value=buf.getvalue())
# 清空缓冲区并关闭写入器
buf.close()
writer = None
# 等待消息被完全发送
producer.flush()
在这个示例中,我们手动指定了一个包含'name”和'age”字段的Avro模式。然后,我们使用该模式来序列化记录并将其发送到Kafka。注意,这个例子中还使用了模式注册表URL,但是它在AvroProducer对象构造函数的参数中声明为模式注册表URL选项。