kafka生产者和消费者(python版)

生产者

producer = KafkaProducer(bootstrap_servers=[”ip:port“])
producer.bootstrap_connected()
producer.send(self.topic_name_send,str.encode(json.dumps(message))).get()
producer.close()

消费者

消费者中的组名主要用户针对主题的偏移量进行更改,也涉及到主题中分区的问题,

consumer = KafkaConsumer(bootstrap_servers=["ip:port"], group_id="组名")
tp = TopicPartition("主题名", 0)
consumer.assign([tp])
consumer.position(tp)
# 修改用户组的偏移量为最新的
# consumer.seek_to_beginning()
last_offset = consumer.end_offsets([tp])[tp]
data_list = []
for msg in consumer:
    # print(msg.topic, msg.partition, msg.offset, msg.timestamp, msg.key, msg.value)
    # 对数据进行解析为dict
    res = json.loads(msg.value)
    data_list.append(res)
    # 用于读取数据结束的退出
    if msg.offset == last_offset - 1:
        break
consumer.commit()
        

kafka工具类

此工具类基本上拿过去就可以用

import datetime
import json
import time

from kafka import KafkaProducer, KafkaConsumer, TopicPartition
from env import enviroments,ENV
import logging


class KafkaHelper(object):
    def __init__(self, host=enviroments[ENV]['kafka']["host"], topic_send=enviroments[ENV]['kafka']['kafka_topic_send'],
                 topic_receive=enviroments[ENV]['kafka']['kafka_topic_receive'],
                 group_id = "python_test"):
        self.topic_name_send = str(topic_send)
        self.topic_name_receive = str(topic_receive)
        self.host = host
        self.group_id = group_id


    def send_msg(self, topic="test", msg="默认测试数据"):
        try:
            producer = KafkaProducer(bootstrap_servers=[self.host])
            producer.bootstrap_connected()
        except Exception as e:
            logging.error(f"发送消息时链接kafka失败,突出消息发送,失败原因:{e}")
            return
        message = {
            "topic": topic,
            "from": "python",
            "time": str(datetime.datetime.utcnow()),
            "data": msg
        }
        try:
            producer.send(self.topic_name_send,str.encode(json.dumps(message))).get()
        except Exception as e:
            logging.error(f"kafka发送数据失败,要发送的数据:{message},失败原因:{e}")
        finally:
            producer.close()

    # 消费者链接可能存在每次消费一个的情况,需要不断的创建和销毁消费者
    def get_one_data(self) -> list:
        try:
            consumer = KafkaConsumer(bootstrap_servers=[self.host], group_id=self.group_id)
            tp = TopicPartition(self.topic_name_receive, 0)
            consumer.assign([tp])
            consumer.position(tp)
        except Exception as e:
            logging.error(f"读取消息时链接kafka失败,突出消息发送,失败原因:{e}")
            return
        data_list = []
        try:
            for msg in consumer:
                # print(msg.topic, msg.partition, msg.offset, msg.timestamp, msg.key, msg.value)
                # 对数据进行解析为dict
                res = json.loads(msg.value)
                data_list.append(res)
                consumer.commit()
                consumer.close()
        except Exception as e:
            logging.error(f"读取kafka单条失败,失败原因:{e}")
        finally:
            consumer.close()
            return data_list

    def receive_msg(self)->list:
        try:
            consumer = KafkaConsumer(bootstrap_servers=[self.host], group_id=self.group_id)
            tp = TopicPartition(self.topic_name_receive, 0)
            consumer.assign([tp])
            consumer.position(tp)
            # now_offset = consumer.offsets_for_times(timestamps=int(time.time()*1000000))
            # 修改用户组的偏移量为最新的
            # consumer.seek_to_beginning()

            print(consumer.config.keys())
            last_offset = consumer.end_offsets([tp])[tp]
            print(last_offset)
        except Exception as e:
            logging.error(f"读取消息时链接kafka失败,突出消息发送,失败原因:{e}")
            return

        data_list = []
        try:
            for msg in consumer:
                # print(msg.topic, msg.partition, msg.offset, msg.timestamp, msg.key, msg.value)
                # 对数据进行解析为dict
                res = json.loads(msg.value)
                data_list.append(res)
                if msg.offset == last_offset - 1:
                    break
            consumer.commit()
        except Exception as e:
            logging.error(f"读取kafka单条失败,失败原因:{e}")
        finally:
            consumer.close()
            return data_list

疑问

  1. 当消费者链接kafka时发现topic没有未读的消息怎样退出呢,默认是在一直等待,但是我期望没有要读的消息的时候直接退出即可

本人小白一枚,有什么不对的地方欢迎大家指出,也可以加q一起讨论技术哦(不要嫌弃我菜) 1147528161

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值