confluent-kafka 和kafka-python操作kafka,并封装成一个类

为了向Kafka集群生产和消费消息,我们可以使用confluent-kafka库,它是Confluent为Python提供的官方Kafka客户端。以下是一个简化的示例,展示如何将Kafka的生产者和消费者操作封装到一个类中:

首先,确保你已经安装了所需的库:

复制代码
pip install confluent-kafka

然后,你可以使用以下代码:

复制代码
from confluent_kafka import Producer, Consumer, KafkaError

class KafkaManager:
    def __init__(self, bootstrap_servers):
        self.bootstrap_servers = bootstrap_servers

    def produce(self, topic, key, value):
        """生产消息到Kafka"""
        p = Producer({'bootstrap.servers': self.bootstrap_servers})

        def delivery_report(err, msg):
            """Called once for each message produced to indicate delivery result."""
            if err is not None:
                print('Message delivery failed: {}'.format(err))
            else:
                print('Message delivered to {} [{}]'.format(msg.topic(), msg.partition()))

        p.produce(topic, key=key, value=value, callback=delivery_report)
        p.flush()

    def consume(self, topic, group_id, timeout=1.0):
        """从Kafka消费消息"""
        c = Consumer({
            'bootstrap.servers': self.bootstrap_servers,
            'group.id': group_id,
            'auto.offset.reset': 'earliest'
        })

        c.subscribe([topic])

        while True:
            msg = c.poll(timeout)
            if msg is None:
                continue
            if msg.error():
                if msg.error().code() == KafkaError._PARTITION_EOF:
                    print('Reached end of partition')
                else:
                    print('Error while consuming message: {}'.format(msg.error()))
            else:
                print('Received message: {}'.format(msg.value().decode('utf-8')))

        c.close()

# 使用示例
if __name__ == "__main__":
    manager = KafkaManager('localhost:9092')

    # 生产消息
    manager.produce('test_topic', 'key1', 'value1')

    # 消费消息
    manager.consume('test_topic', 'test_group')

pip install kafka-python

from kafka import KafkaProducer, KafkaConsumer

class KafkaManager:
    def __init__(self, bootstrap_servers):
        self.bootstrap_servers = bootstrap_servers

    def produce(self, topic, key, value):
        """生产消息到Kafka"""
        producer = KafkaProducer(bootstrap_servers=self.bootstrap_servers,
                                 key_serializer=str.encode,
                                 value_serializer=str.encode)
        
        producer.send(topic, key=key, value=value)
        producer.flush()
        producer.close()

    def consume(self, topic, group_id, timeout=10):
        """从Kafka消费消息"""
        consumer = KafkaConsumer(topic,
                                 bootstrap_servers=self.bootstrap_servers,
                                 group_id=group_id,
                                 auto_offset_reset='earliest',
                                 key_deserializer=bytes.decode,
                                 value_deserializer=bytes.decode)
        
        for message in consumer:
            print(f"Received message: {message.value}")

        consumer.close()

# 使用示例
if __name__ == "__main__":
    manager = KafkaManager('localhost:9092')

    # 生产消息
    manager.produce('test_topic', 'key1', 'value1')

    # 消费消息
    manager.consume('test_topic', 'test_group')
相关推荐
咖啡の猫1 小时前
Python字典推导式
开发语言·python
曹文杰15190301121 小时前
2025 年大模型背景下应用统计本科 计算机方向 培养方案
python·线性代数·机器学习·学习方法
Wulida0099912 小时前
建筑物表面缺陷检测与识别:基于YOLO11-C3k2-Strip模型的智能检测系统
python
FJW0208142 小时前
Python_work4
开发语言·python
爱笑的眼睛113 小时前
从 Seq2Seq 到 Transformer++:深度解构与自构建现代机器翻译核心组件
java·人工智能·python·ai
yaoh.wang3 小时前
力扣(LeetCode) 88: 合并两个有序数组 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·双指针
执笔论英雄3 小时前
【RL】slime创建actor的流程
python
吴佳浩 Alben3 小时前
Python入门指南(四)
开发语言·后端·python
小智RE0-走在路上4 小时前
Python学习笔记(8) --函数的多返回值,不同传参,匿名函数
笔记·python·学习
ZHSH.4 小时前
2026蓝桥杯备赛 | 赛事介绍及python基础(未完)
python·蓝桥杯·数据结构与算法