Python kafka生产者消费者
生产者(1)
# coding=utf-8 # 生产者脚本 import json from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers="10.44.99.103:9092") msg_dict = { 'method':"post", 'header':'json', 'content':"19092", } print(msg_dict) msg = json.dumps(msg_dict).encode(encoding='utf-8') producer.send('td-test',msg) producer.close()
生产者(2)
from confluent_kafka import Producer import json # Kafka生产者配置 conf = { 'bootstrap.servers': 'YOUR_BOOTSTRAP_SERVERS', # Kafka集群的地址 'acks': 'all', # 等待所有副本确认 'enable.idempotence': True # 启用幂等性 } # 创建Kafka生产者实例 producer = Producer(conf) # 定义消息发送的回调函数 def delivery_report(err, msg): if err is not None: print('Message delivery failed: {}'.format(err)) else: print('Message delivered to {} [{}]'.format(msg.topic(), msg.partition())) # 要发送的消息 messages = [ {'topic': 'YOUR_TOPIC', 'value': 'Hello Kafka!'}, # 可以添加更多消息 ] # 发送消息并使用回调函数 for message in messages: producer.produce( message['topic'], value=json.dumps(message['value']), # 将消息转换为JSON格式 callback=delivery_report ) # 等待所有消息发送完成 producer.flush() print('All messages produced.')
消费者(1)
# coding=utf-8 # 消费者脚本 from kafka import KafkaConsumer consumer = KafkaConsumer('td-test', bootstrap_servers=['10.44.99.103:9092']) for msg in consumer: recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value) print (recv)
消费者(2)
from confluent_kafka import Consumer, KafkaError # Kafka消费者配置 conf = { 'bootstrap.servers': 'YOUR_BOOTSTRAP_SERVERS', # Kafka集群的地址 'group.id': 'YOUR_GROUP_ID', # 消费者组ID 'auto.offset.reset': 'earliest', # 无offset时从最开始消费 'enable.auto.commit': True # 是否自动提交offset } # 创建Kafka消费者实例 consumer = Consumer(conf) # 订阅Kafka主题 consumer.subscribe(['YOUR_TOPIC']) def consume(): try: # 轮询检查消息 while True: message = consumer.poll(1.0) # 1秒超时 if message is None: continue # 没有消息,继续循环 if message.error(): if message.error().code() == KafkaError._PARTITION_EOF: # 打印消息并继续 print('End of partition reached {0}/{1}'.format( message.topic(), message.partition())) else: print('Error: {0}'.format(message.error())) else: # 打印接收到的消息 print('Received message: {}'.format(message.value().decode('utf-8'))) except KeyboardInterrupt: pass finally: # 消费者关闭前提交任何未提交的offset consumer.close() # 开始消费 consume()
注:
1)在 windows 和 linux 上 是有一些区别的,首先在 windows 上要进行编码 encode ,而在 linux 上是不需要进行编码的。
2)在 windows 的 C:\Windows\System32\drivers\etc\hosts 文件要添加 IP地址 与 节点名