我有一个Kafka流应用程序,听两个主题。如果两个kafka主题具有相同的键和相同的分区计数,那么具有相同键的事件是否总是转到一个流线程(固定数量的流线程)?
nlejzf6q1#
没有这样的保证。拥有这些密钥的分区的领导者的代理可以是不同的,因此分配给不同的使用者线程。
ltskdhd12#
不,不能保证主题t1中带有密钥k1的事件e1和主题t2中带有密钥k2的事件e2始终由同一流线程处理。kafka streams将分区分配给流线程,而不是事件。kafka流中分区的分配:假设输入主题t1和t2各有3个分区,即t1p0(主题t1的第一个分区)t1p1(主题t2的第二个分区)t1p2和类似的主题t2。假设有两个使用者—每个使用者运行两个线程—让我们假设线程的名称是c1-0、c1-1、c2-0、c2-1。一旦kafka流应用程序重新启动,它就会进入重新平衡阶段,发现两件事:1。流拓扑中的使用者数,并查找所有使用者的线程名称2。拓扑中的输入分区数(跨所有主题)。然后将所有分区分配给线程。目前有两种分区分配策略:range和roundrobin。范围:范围分区分配策略按数字顺序排列可用分区,按字典顺序排列使用者线程。然后将分区数除以使用者线程数,以确定每个使用者线程应包含多少个分区。在上面的示例中-最终的分区分配将如下所示:c1-0将获得分区t1p0,t1p1 c1-1将获得分区t1p2,t2p0 c2-0将获得分区t2p1 c2-1将获得分区t2p2范围分区分配策略是kafka流用来分配分区的默认策略。在这种情况下,主题t1中带有密钥k1的e1将始终转到t1p0,主题t2中带有密钥k2的e2可以始终转到t2p0—这两个分区都分配给不同的流线程。循环赛round-robin策略通过hashcode对主题分区对(t1p0、t1p1等)进行排序,以减少将一个主题的所有分区分配给一个使用者或一个流线程的可能性。然后以循环方式将排序后的主题分区对分配给可用的使用者线程。在上面的示例中-最终的分区分配将如下所示:c1-0将获得分区t1p0,t2p1 c1-1将获得分区t1p1,t2p2 c2-0将获得分区t1p2 c2-1将获得分区t2p0在这种情况下,由于t1p0和t2p0被分配给不同的流线程,因此具有相同密钥的e1和e2将被不同的分区处理。
2条答案
按热度按时间nlejzf6q1#
没有这样的保证。
拥有这些密钥的分区的领导者的代理可以是不同的,因此分配给不同的使用者线程。
ltskdhd12#
不,不能保证主题t1中带有密钥k1的事件e1和主题t2中带有密钥k2的事件e2始终由同一流线程处理。
kafka streams将分区分配给流线程,而不是事件。
kafka流中分区的分配:
假设输入主题t1和t2各有3个分区,即t1p0(主题t1的第一个分区)t1p1(主题t2的第二个分区)t1p2和类似的主题t2。
假设有两个使用者—每个使用者运行两个线程—让我们假设线程的名称是c1-0、c1-1、c2-0、c2-1。
一旦kafka流应用程序重新启动,它就会进入重新平衡阶段,发现两件事:1。流拓扑中的使用者数,并查找所有使用者的线程名称2。拓扑中的输入分区数(跨所有主题)。
然后将所有分区分配给线程。目前有两种分区分配策略:range和roundrobin。
范围:
范围分区分配策略按数字顺序排列可用分区,按字典顺序排列使用者线程。然后将分区数除以使用者线程数,以确定每个使用者线程应包含多少个分区。
在上面的示例中-最终的分区分配将如下所示:c1-0将获得分区t1p0,t1p1 c1-1将获得分区t1p2,t2p0 c2-0将获得分区t2p1 c2-1将获得分区t2p2
范围分区分配策略是kafka流用来分配分区的默认策略。
在这种情况下,主题t1中带有密钥k1的e1将始终转到t1p0,主题t2中带有密钥k2的e2可以始终转到t2p0—这两个分区都分配给不同的流线程。
循环赛
round-robin策略通过hashcode对主题分区对(t1p0、t1p1等)进行排序,以减少将一个主题的所有分区分配给一个使用者或一个流线程的可能性。然后以循环方式将排序后的主题分区对分配给可用的使用者线程。
在上面的示例中-最终的分区分配将如下所示:c1-0将获得分区t1p0,t2p1 c1-1将获得分区t1p1,t2p2 c2-0将获得分区t1p2 c2-1将获得分区t2p0
在这种情况下,由于t1p0和t2p0被分配给不同的流线程,因此具有相同密钥的e1和e2将被不同的分区处理。