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地址 与 节点名

 

posted @ 2021-01-17 09:36  你的小可爱吖  阅读(95)  评论(0编辑  收藏  举报