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')
相关推荐
smileNicky1 小时前
RabbitMQ有多少种Exchange?
分布式·rabbitmq
你我约定有三1 小时前
RabbitMQ--消息丢失问题及解决
java·开发语言·分布式·后端·rabbitmq·ruby
xw33734095641 小时前
彩色转灰度的核心逻辑:三种经典方法及原理对比
人工智能·python·深度学习·opencv·计算机视觉
倔强青铜三1 小时前
为什么 self 与 super() 成了 Python 的永恒痛点?
人工智能·python·面试
墨尘游子1 小时前
目标导向的强化学习:问题定义与 HER 算法详解—强化学习(19)
人工智能·python·算法
Java初学者小白1 小时前
秋招Day19 - 分布式 - 分布式事务
java·分布式
小白学大数据2 小时前
基于Python的新闻爬虫:实时追踪行业动态
开发语言·爬虫·python
freed_Day2 小时前
python面向对象编程详解
开发语言·python
普郎特3 小时前
张三:从泥水匠到包工头的故事 *—— 深入浅出讲解 `run_in_executor()` 的工作原理*
python
我要学习别拦我~3 小时前
kaggle分析项目:steam付费游戏数据分析
python·游戏·数据分析