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')
相关推荐
曲幽27 分钟前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程5 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪5 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook5 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田18 小时前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽1 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战1 天前
Pydantic配置管理最佳实践(一)
python
阿尔的代码屋1 天前
[大模型实战 07] 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent
人工智能·python
AI探索者2 天前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python