实现指定的时间间隔来消费Kafka消息

在许多实时数据处理场景中,我们可能需要在特定的时间间隔内消费来自Kafka队列的消息。本篇文章将实现在给定的时间范围内消费Kafka消息。

一、 三方库介绍

        在python中这 kafka-python 和confluent_kafka 可以与kafka进行交互,kafka-python的易用性高、兼容性高、与Python生态系统的整合以及良好的代码可读性和可维护性,confluent_kafka底层使用了librdkafka库(一个高度优化过的C语言实现),所以其具有低延迟和高吞吐量的数据传输,其实在我们接触数据吞吐量不大的情况下,两者几乎没有什么差异,用法也大致相同,那么本篇就使用kafka-python来实现。

二、创建脚本

        1.kafka相关配置

# kafka配置
KAFKA_CONFIG = {'bootstrap_servers': ['127.0.0.1:9092'],
                'group_id': 'test_group'}
task_topic= 'test_topic'

        2.实现逻辑

def get_time_stamp(date_str):
    """
    将时间转为时间戳
    :params date_str:时间字符串
    示例输入: 2024-05-30 15:30:00
    """
    date_obj = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
    # 将日期对象转换为UTC时间戳(秒为单位)
    timestamp_seconds = int(time.mktime(date_obj.timetuple()))
    # 将秒转换为毫秒
    timestamp_millis = timestamp_seconds * 1000
    return timestamp_millis


def consume_messages_in_time_range(start_time, end_time=None):
    """
    1.将传入时间转为时间戳
    2.获取当前主题分区数
    3.设置指定消费时间区间的偏移量
    4.按分区消费并设置偏移量
    """
    consumer = KafkaConsumer(KAFKA_CONFIG)
    # 设置起始结束时间
    start_timestamp = get_time_stamp(start_time)
    end_timestamp = get_time_stamp(end_time)
    par_list = consumer.partitions_for_topic(task_topic)
    tps = [TopicPartition(task_topic, p) for p in par_list]
    consumer.assign(tps)
    # 获取当前分配给该消费者的 TopicPartitions
    partitions = consumer.assignment()
    partition_start_timestamp = {part: start_timestamp for part in partitions}
    # 根据时间戳查找给定分区的偏移量
    mapping = consumer.offsets_for_times(partition_start_timestamp)
    # 按分区消费
    for partition, ts in mapping.items():
        consumer.seek(partition, ts[0])  # 每个分区设置偏移量
        for message in consumer:
            message_value = message.value.decode('utf-8')
            # 操作消息
            # 根据时间戳来退出
            if message.timestamp >= end_timestamp:
                consumer.close()
                break

        3.方法和参数说明

config:包含Kafka消费者配置的字典。
get_time_stamp方法将日期字符串转换为以毫秒为单位的时间戳。
consume_messages_in_time_range方法使用指定时间范围内的消息。(注意:如果没有提供结束时间会一直阻塞)。

三、实现原理

  • 将时间转换为时间戳

    • 将开始时间从可读的日期字符串转换为以毫秒为单位的 Unix 时间戳。这标准化了时间格式,并使其与 Kafka 基于时间戳的偏移量查找兼容。
  • 识别分区

    • 查询指定主题的分区列表。Kafka 主题分为多个分区,以实现并行使用和可扩展性。
  • 将分区分配给消费者

    • 将已识别的分区分配给消费者。这确保消费者负责从这些特定分区读取消息。
  • 根据时间戳确定起始偏移量

    • 使用offsets_for_times方法找到每个分区的起始时间戳对应的偏移量。Kafka 可以将时间戳映射到最接近的可用偏移量。
  • 设置消费偏移量

    • 查找每个分区的计算偏移量。这会根据指定的开始时间将消费者定位在正确的起点。
  • 消费消息

    • 进入循环以轮询消息。在消息被消费时,消费者从当前位置(由搜索操作设置)读取到主题末尾或直到达到结束时间戳。

四、结尾

        在探索了Kafka如何支持指定时间区间内消费消息的功能后,我们不难发现,这一功能对于数据审计、回溯分析以及数据恢复等场景具有极高的实用价值。通过精确控制消费的时间范围,用户能够更灵活地处理Kafka中的消息数据,满足各种业务需求。

最后,感谢大家阅读本篇博客。希望通过本文的介绍,大家能够对Kafka有更深入的了解,并在实际工作中加以应用。同时,也欢迎大家在评论区留下宝贵的意见和建议,让我们共同学习和进步。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小航SDB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值