了解Kafka主题和分区

Pin*_*est 136 apache-kafka kafka-consumer-api kafka-producer-api

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

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

  1. 当一个制作人正在制作一条消息时 - 它会指定它想要发送消息的主题,是吗?它关心分区吗?
  2. 当订阅者正在运行时 - 它是否指定了其组ID,以便它可以是同一主题的消费者群集的一部分,或者是该群体消费者感兴趣的几个主题?
  3. 每个消费者组在代理上是否有相应的分区,或者每个消费者都有一个分区?

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

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

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

C4s*_*tor 109

让我们按顺序:)

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

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


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

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


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

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


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

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


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

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


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

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

  • Sry :) 在 500 个字符框中解释整个 kafka 过程有点困难,我建议阅读 http://kafka.apache.org/documentation.html#theconsumer(可能还有第 4 节的其余部分,关于 kafka 内部)。基本上:消费者 _request_ 保存偏移量,但它们保存在其他地方。 (3认同)

mrs*_*vas 102

这篇文章已经有了答案,但我在Kafka权威指南中添加了几张图片

在回答每个问题之前,让我们添加生产者组件的概述

生产者组件概述

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

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

  • 分区ID,如果用消息指定的话
  • key%num分区,如果没有提到分区ID
  • 如果消息中既没有分区ID也没有消息密钥,则循环,仅表示值

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

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

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

在一个使用者组中,每个分区仅由一个使用者处理.这些是可能的情况

  • 消费者数少于主题分区数,则可以将多个分区分配给组中的一个消费者 少于主题分区的消费者数量
  • 消费者数量与主题分区数量相同,然后分区和消费者映射可以如下所示, 消费者数量与主题分区数量相同
  • 消费者数量超过主题分区数量,然后分区和消费者映射可以如下,无效,请查看消费者5 消费者数量超过主题分区数量

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

正如我们在问题3中讨论的那样,消费者应该知道分区的数量.

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

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

更多关于集团协调员:

  1. 它是Kafka服务器端集群中的一个选举代理.
  2. 消费者与组协调器交互以进行偏移提交和获取请求.
  3. 消费者向组协调员发送定期心跳.

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

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

  • 嗨!我是公认答案的作者,但我认为您的观点也非常好,尤其是在第3点上,图表使事情更清晰了200%!您认为我们应该合并吗? (4认同)
  • 另一种情况。您可以让一个分区和多个消费者订阅/分配给它。经纪人将仅向第一个注册的消费者提供记录。但是,我们假设第一个消费者处理任务所花费的时间比轮询间隔更长。记录消费不提交给经纪人。经纪人了解到消费者闲逛。在这种状态下,代理会触发重新平衡,将新分配的分区发送给所有消费者。尽管消息仍在由 C1 处理,但该消息仍被另一个消费者再次使用。当心。 (3认同)

Yur*_*uri 15

Kafka使用Topic概念来为消息流带来秩序.

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

分区是有序的,不断变化的消息序列,它们是不断附加的,即提交日志.

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

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

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

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

本文详细解释:http://codeflex.co/what-is-apache-kafka/