-
Notifications
You must be signed in to change notification settings - Fork 945
Expand file tree
/
Copy pathasyncio_avro_producer.py
More file actions
67 lines (55 loc) · 2.78 KB
/
asyncio_avro_producer.py
File metadata and controls
67 lines (55 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2025 Confluent Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# A minimal example demonstrating AsyncIO Avro producer with Schema Registry.
import argparse
import asyncio
from confluent_kafka.aio import AIOProducer
from confluent_kafka.schema_registry import AsyncSchemaRegistryClient
from confluent_kafka.schema_registry._async.avro import AsyncAvroSerializer
from confluent_kafka.serialization import MessageField, SerializationContext
async def main(args):
# Configure Async Schema Registry client
sr_conf = {'url': args.schema_registry}
if args.sr_api_key and args.sr_api_secret:
sr_conf['basic.auth.user.info'] = f"{args.sr_api_key}:{args.sr_api_secret}"
sr_client = AsyncSchemaRegistryClient(sr_conf)
# Example Avro schema
schema_str = '{"type": "record", "name": "User", "fields": [{"name": "name", "type": "string"}]}'
# Instantiate async serializer
avro_serializer = await AsyncAvroSerializer(sr_client, schema_str=schema_str)
producer = AIOProducer({'bootstrap.servers': args.bootstrap_servers})
try:
# Serialize value and produce
value = {'name': 'alice'}
serialized_value = await avro_serializer(value, SerializationContext(args.topic, MessageField.VALUE))
delivery_future = await producer.produce(args.topic, value=serialized_value)
msg = await delivery_future
print(f"Produced to {msg.topic()} [{msg.partition()}] @ {msg.offset()}")
finally:
await producer.flush()
await producer.close()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='AsyncIO Avro producer example')
parser.add_argument('-b', dest='bootstrap_servers', required=True, help='Bootstrap broker(s) (host[:port])')
parser.add_argument('-s', dest='schema_registry', required=True, help='Schema Registry (http(s)://host[:port])')
parser.add_argument('--sr-api-key', dest='sr_api_key', default=None, help='Confluent Cloud SR API key (optional)')
parser.add_argument(
'--sr-api-secret', dest='sr_api_secret', default=None, help='Confluent Cloud SR API secret (optional)'
)
parser.add_argument('-t', dest='topic', default='example_asyncio_avro', help='Topic name')
args = parser.parse_args()
asyncio.run(main(args))