首页 文章

了解Kafka主题和分区

提问于
浏览
60

我开始学习Kafka用于企业解决方案 .

在我的阅读中,我想到了一些问题:

  • 当一个制作人正在制作一条消息时 - 它会指定要发送消息的 topic ,是吗?它关心分区吗?

  • 订阅者正在运行时 - 它是否指定了其组ID,以便它可以是同一主题的消费者群集的一部分,或者是该群体消费者感兴趣的几个主题?

  • 每个消费者组在代理上是否有相应的分区,或者每个消费者都有一个分区?

  • 作为代理创建的分区,因此不关心消费者?

  • 由于这是一个每个分区都有一个偏移量的队列,因此消费者有责任指定它想要读取的消息吗?是否需要保存其状态?

  • 从队列中删除邮件时会发生什么? - 例如:保留时间为3小时,然后时间过去了,两侧的偏移量如何处理?

3 回答

  • 23

    Kafka使用Topic概念来实现消息流的顺序 .

    为了 balancer 负载,可以将主题划分为多个分区并在代理之间进行复制 .

    分区是有序的,不可变的消息序列,它们被连续附加,即提交日志 .

    分区中的消息具有序列标识号,该标识号唯一标识分区中的每条消息 .

    分区允许主题的日志扩展超出适合单个服务器(代理)的大小,并充当并行性的单位 .

    主题的分区分布在Kafka集群中的代理上,其中每个代理处理数据并请求分区的共享 .

    每个分区都在可配置数量的代理上进行复制,以确保容错 .

    在这篇文章中解释得很好:http://codeflex.co/what-is-apache-kafka/

  • 9

    让我们按顺序:)

    1 - 当 生产环境 者正在生成消息时 - 它将指定要将消息发送到的主题,是吗?它关心分区吗?

    默认情况下, 生产环境 者不关心分区 . 您可以选择使用自定义分区程序来获得更好的控制,但它完全是可选的 .


    2 - 当订阅者正在运行时 - 它是否指定了其组ID,以便它可以成为同一主题的消费者群集的一部分,或者该群体消费者感兴趣的几个主题?

    是的,消费者加入(或创建,如果他们独自一人)消费者群体来共享负载 . 同一组中没有两个消费者会收到相同的消息 .


    3 - 每个消费者组在代理上是否有相应的分区,或者每个消费者都有一个分区?

    都不是 . 在两个条件下,消费者组中的所有消费者都被分配了一组分区:同一组中没有两个消费者具有共同的任何分区 - 并且为每个现有分区分配整个消费者组 .


    4 - 代理是否创建了分区,因此不关心消费者?

    它们不是,但你可以从3看到,拥有比现有分区更多的消费者是完全没用的,所以它是你消费的最大并行度水平 .


    5 - 由于这是一个每个分区都有一个偏移量的队列,因此消费者有责任指定它想要读取哪些消息吗?是否需要保存其状态?

    是的,消费者为每个分区保留每个主题的偏移量 . 这完全由 Kafka 处理,不用担心 .


    6 - 从队列中删除邮件时会发生什么? - 例如:保留时间为3小时,然后时间过去了,两侧的偏移量如何处理?

    如果消费者曾经请求代理上的分区不可用的偏移量(例如,由于删除),则它进入错误模式,并最终将此分区的自身重置为可用的最新消息或最旧消息(取决于auto.offset.reset配置值),并继续工作 .

  • 85

    这篇文章已经有了一个可接受的答案,但我在Kafka权威指南中添加了几张图片我的观点在回答每个问题之前,让我们添加一个 生产环境 者组件的概述

    overview of producer components

    1.当 生产环境 者正在生成消息时 - 它将指定要将消息发送到的主题,是吗?它关心分区吗?

    生产环境 者将决定目标分区放置任何消息取决于

    • 分区ID,如果使用消息指定的话

    • key % num partitions ,如果没有提到分区ID

    • 循环,如果消息中既没有 partition id 也没有 message key ,则仅表示值

    2.当订阅者正在运行时 - 它是否指定了其组ID,以便它可以是同一主题的消费者群集的一部分,或者是该群体消费者感兴趣的几个主题?

    除非您使用简单的赋值API,否则应始终配置 group.id 不需要在 Kafka 存储偏移量 . 它不会成为任何团体的一部分 . source

    3.每个消费者组在代理上是否有相应的分区,或者每个消费者都有一个分区?

    In one consumer group, each partition will be processed by one consumer only . 这些是可能的情况

    • 消费者数量 less than 主题分区数量,然后可以将多个分区分配给组中的一个消费者
      number of consumers less than topic partitions

    • 消费者数量 same 作为主题分区的数量,然后分区和消费者映射可以如下所示,
      number of consumers same as number of topic partitions

    • 消费者数 more than 主题分区数,然后分区和消费者映射可以如下,无效,查看消费者5
      number of consumers more than number of topic partitions

    4.作为经纪人创建的分区,因此不关心消费者?

    正如我们在问题3中讨论的那样, Consumer should to be aware 分区数量 .

    5.由于这是一个每个分区都有一个偏移量的队列,因此消费者有责任指定它想要读取哪些消息吗?是否需要保存其状态?

    Kafka通过向特殊的 __consumer_offsets 主题生成消息来处理偏移状态内部,此行为也可以通过 enable.auto.commitfalse 进行手动配置 . 在这种情况下, consumer.commitSync()consumer.commitAsync() 可以帮助管理偏移量 .

    6.从队列中删除邮件时会发生什么? - 例如:保留时间为3小时,然后时间过去了,两侧的偏移量如何处理?

    如果任何消费者在保留期后启动,则消息将根据 auto.offset.reset 配置消耗,该配置可能是 latest/earliest . 从技术上讲,它是 latest (开始处理新消息),因为所有消息都在那个时间到期,保留是主题级别配置 .

相关问题