Apache kafka 如何扩展Kafka流应用程序

Apache kafka 如何扩展Kafka流应用程序,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我对卡夫卡文献中关于这个主题的措辞有点困惑,所以我想问一下,我是否正确地解释了这里的内容 因此,如果我正确理解了这一点,那么扩展Kafka流应用程序的唯一方法就是启动应用程序的新实例(或增加应用程序中的流线程数),这将确保consumerGroup('application.id')下有更多的使用者,因此,我可以将我的流应用程序扩展到主题的多个分区(实际上,如果我的流拓扑连接到多个主题,假设TopicA有5个分区,topicB有3个分区,那么会发生什么情况?我加入了TopicA和topicB的流

我对卡夫卡文献中关于这个主题的措辞有点困惑,所以我想问一下,我是否正确地解释了这里的内容

因此,如果我正确理解了这一点,那么扩展Kafka流应用程序的唯一方法就是启动应用程序的新实例(或增加应用程序中的流线程数),这将确保consumerGroup('application.id')下有更多的使用者,因此,我可以将我的流应用程序扩展到主题的多个分区(实际上,如果我的流拓扑连接到多个主题,假设TopicA有5个分区,topicB有3个分区,那么会发生什么情况?我加入了TopicA和topicB的流,我猜在这种情况下我可以扩展到3个实例/线程)

现在让我们假设我有一个带有5个分区的topicA,我启动了3个应用程序实例,如果我在拓扑中配置了KTable,每个KTable将包含来自某个分区的信息,我必须通过元数据找出我的密钥在哪个实例(分区)上,那么当我启动第4个实例时会发生什么,让我们假设在实例3上可设置为KTable的键/值现在可以在实例4上设置为KTable,不是吗?一个附带的问题是,这种重新平衡需要多长时间(我认为这取决于主题大小,所以假设它需要1分钟,在这个操作过程中,查询KTable的应用程序会没有响应吗?)

附带的一个问题是,这种机制对“streamBuilder.table(..)”和“streamBuilder.groupByKey(..).reduce(..)”的作用是否完全相同

最后一个问题,同样是一个有5个分区的主题,但我没有启动应用程序的3个实例,而是启动了一个有3个流线程(num.stream.threads=3)的实例。如果我将线程大小更改为3到4,我是否会再次使用代表5个分区的3ktable,其行为是否与增加实例数完全相同

谢谢你的回答

假设TopicA有5个分区,topicB有3个分区,我加入了 TopicA和TopicB的流,我猜我可以扩展到3个 在本例中为实例/线程)

首先,为了连接两个主题,它们应该有相同数量的分区。这是加入的关键要求。如果主题A有5个分区,主题B有3个分区,它将永远不会执行联接。()

当我启动第四个实例时会发生什么

是的,Kafka streams将根据分区的数量跨实例重新平衡工作负载。它将重新分配分区及其任务,包括本地状态存储。时间取决于主题的大小。如果有最终用户查询ktable,您应该更喜欢从所有实例收集元数据并执行查找

对于“streamBuilder.table(..”,该机制的工作原理是否完全相同 和“streambuilder.groupByKey(..).reduce(..)”

是的,每当使用任何转换创建ktable时,都会遵循相同的机制

同样是一个有5个分区的主题,而不是启动3个 在应用程序中,我用3个流线程启动了一个实例 (num.stream.threads=3)我是否还会有表示5的3ktable 分区,它的行为是否与增加 如果我将线程大小3更改为4,则实例数

默认情况下,Kafka Streams将拓扑分解为5个任务(=分区数)。如果
num.stream.threads
设置为3,则这些任务将分布在指定的线程中。因此线程1可以运行2个任务,线程2可以运行接下来的2个任务,线程3可以运行1个任务。
KTable状态将被划分为5个分片(=分区数),一个分片将映射到一个任务。因此,每个任务都将创建一个本地存储,而不包括任务本身。这些本地存储包含相应分片的数据。不管线程的数量如何,您将得到的本地存储等于分区的数量

例如:

再添加一个实例之后

假设TopicA有5个分区,topicB有3个分区,我加入了 TopicA和TopicB的流,我猜我可以扩展到3个 在本例中为实例/线程)

首先,为了连接两个主题,它们应该有相同数量的分区。这是加入的关键要求。如果主题A有5个分区,主题B有3个分区,它将永远不会执行联接。()

当我启动第四个实例时会发生什么

是的,Kafka streams将根据分区的数量跨实例重新平衡工作负载。它将重新分配分区及其任务,包括本地状态存储。时间取决于主题的大小。如果有最终用户查询ktable,您应该更喜欢从所有实例收集元数据并执行查找

对于“streamBuilder.table(..”,该机制的工作原理是否完全相同 和“streambuilder.groupByKey(..).reduce(..)”

是的,每当使用任何转换创建ktable时,都会遵循相同的机制

同样是一个有5个分区的主题,而不是启动3个 在应用程序中,我用3个流线程启动了一个实例 (num.stream.threads=3)我是否还会有表示5的3ktable 分区,它的行为是否与增加 如果我将线程大小3更改为4,则实例数

默认情况下,Kafka Streams将拓扑分解为5个任务(=分区数)。如果
num.stream.threads
设置为3,则这些任务将分布在指定的线程中。因此线程1可以运行2个任务,线程2可以运行接下来的2个任务,线程3可以运行1个任务。
KTable状态将被划分为5个分片(=分区数),一个分片将映射到一个任务。因此,每个任务都将创建一个本地存储,而不包括任务本身。这些本地存储包含相应分片的数据。尽管