我开始学习Kafka的企业解决方案的目的。
在阅读过程中,我想到了一些问题:
当一个生产者正在产生一个消息-它将指定主题,它想把消息发送到,是吗?它关心分区吗?
当订阅服务器正在运行时-它是否指定其组id以便它可以是同一主题的使用者群集的一部分,或者是这组使用者感兴趣的几个主题的一部分?
是每个使用者组在代理上都有相应的分区,还是每个使用者都有一个分区?
分区是由代理创建的,因此不是使用者关心的问题吗?
因为这是一个每个分区都有偏移量的队列,所以使用者是否有责任指定要读取的消息?它需要保存它的状态吗?
从队列中删除消息时会发生什么情况?-例如:保留3个小时,然后时间流逝,如何处理两边的偏移?
3条答案
按热度按时间bxgwgixi1#
Kafka运用主题概念,将秩序带入信息流。
为了平衡负载,可以将主题划分为多个分区,并跨代理进行复制。
分区是连续附加的有序、不可变的消息序列,即提交日志。
分区中的消息具有唯一标识分区中每个消息的顺序id号。
分区允许主题的日志扩展到超出一个服务器(代理)的大小,并充当并行单元。
主题的分区分布在kafka集群中的代理上,每个代理处理数据和请求共享分区。
每个分区跨可配置数量的代理进行复制,以确保容错性。
这篇文章解释得很好:http://codeflex.co/what-is-apache-kafka/
yws3nbqq2#
这篇文章已经有了答案,但我添加了一些来自Kafka权威指南的图片我的看法
在回答每个问题之前,让我们添加生产者组件的概述:
1. 当一个生产者正在产生一个消息-它将指定主题,它想把消息发送到,是吗?它关心分区吗?
生产者将决定目标分区放置任何消息,具体取决于:
分区id(如果在消息中指定)
键%num partitions,如果没有提到分区id
如果在消息中分区id和消息键都不可用,则循环,这意味着只有值可用
2. 当订阅者正在运行时-它是否指定了它的组id,以便它可以是同一主题的使用者集群的一部分,或者是这组使用者感兴趣的几个主题的使用者集群的一部分?
您应该始终配置group.id,除非您使用的是简单分配api,并且不需要在kafka中存储偏移量。它不会成为任何团体的一部分。来源
3. 是每个使用者组在代理上都有相应的分区,还是每个使用者都有一个分区?
在一个使用者组中,每个分区将仅由一个使用者处理。这些是可能的情况
使用者的数量小于主题分区的数量,则可以将多个分区分配给组中的一个使用者
使用者的数量与主题分区的数量相同,那么分区和使用者Map可以如下所示,
消费者的数量高于主题分区的数量,那么分区和消费者的Map可以如下所示,不有效,检查消费者5
4. 由于分区是由代理创建的,因此不必为消费者担心?
使用者应该知道分区的数量,如问题3中所讨论的。
5. 因为这是一个每个分区都有偏移量的队列,所以使用者是否有责任指定要读取的消息?它需要保存它的状态吗?
kafka(作为特定的组协调器)通过生成一条消息到内部消费者偏移主题来处理偏移状态,这个行为也可以通过设置
enable.auto.commit
至false
. 那样的话consumer.commitSync()
以及consumer.commitAsync()
有助于管理抵销。有关组协调员的详细信息:
它是kafka服务器端集群中被选中的代理之一。
使用者与组协调器交互,以执行偏移提交和获取请求。
消费者定期向组协调器发送心跳。
6. 从队列中删除消息时会发生什么情况?-例如:保留3个小时,然后时间流逝,如何处理两边的偏移?
如果任何使用者在保留期之后启动,则消息将按照
auto.offset.reset
可能是latest/earliest
. 从技术上说是latest
(开始处理新邮件),因为所有邮件在该时间之前都已过期,保留期是主题级配置。iibxawm43#
让我们把它们按顺序排列:)
1-当生产者生成消息时-它将指定要将消息发送到的主题,对吗?它关心分区吗?
默认情况下,生产者不关心分区。您可以选择使用定制的分区器来获得更好的控制,但这是完全可选的。
2-当订阅服务器正在运行时-它是否指定其组id,以便它可以成为该组用户感兴趣的相同主题或多个主题的用户群的一部分?
是的,消费者加入(或者单独创建)一个消费者组来共享负载。同一组中的任何两个消费者都不会收到相同的消息。
3-是每个消费者组在代理上都有相应的分区,还是每个消费者都有一个分区?
都不是。使用者组中的所有使用者都被分配了一组分区,这有两种情况:同一组中没有两个使用者有任何共同的分区,而且使用者组作为一个整体被分配了每个现有分区。
4-因此,代理创建的分区是否不是使用者关心的问题?
它们不是,但是您可以从3中看到,拥有比现有分区更多的使用者是完全没有用的,因此这是消耗的最大并行级别。
5-既然这是一个每个分区都有偏移量的队列,那么使用者是否有责任指定要读取的消息?它需要保存它的状态吗?
是的,使用者为每个分区的每个主题保存一个偏移量。这完全是Kafka的事,不用担心。
6-从队列中删除消息时会发生什么情况?-例如:保留3个小时,然后时间流逝,如何处理两边的偏移?
如果使用者曾经请求代理上的分区不可用的偏移量(例如,由于删除),它将进入错误模式,并最终将此分区的自身重置为可用的最新或最旧消息(取决于auto.offset.reset配置值),然后继续工作。