我们可以将邮件重新发送到多个Kafka分区吗

时间:2020-07-25 05:19:43

标签: apache-kafka apache-kafka-streams

我有一个有状态的应用程序,用于维护与用户的会话。此应用程序有5个实例。

以下是主题:
所有主题都有5个分区。

topic1
topic2
topic3

Topic1和topic2分别用于构建状态存储和全局ktable。这两个主题都使用用户名作为消息键。这些主题中的数据由应用程序实例本身生成。

现在,另一个应用程序使用与消息密钥相同的用户名将数据发送到topic3。

我的期望是它将转到与该用户在其本地状态存储区中的实例使用的分区相同的分区。是这样吗?

对于每条消息,也应由具有此用户会话的其他实例处理。如果该实例找到其他实例侦听的分区并将消息转发到其他分区,那么设计是否正确?

是可扩展的设计,还是最好将所有消息广播到所有分区(差异使用者组),并由实例决定是否进行处理

1 个答案:

答案 0 :(得分:0)

我不确定您是否真的需要将数据发送到多个分区...

  1. 如果您具有GlobalKTable(或全局存储),则每个实例将读取所有主题分区,从而在本地实现数据的完整副本。 (因此,如果您确实使用交互式查询,则由于所有数据都是本地数据,因此不会进行远程调用。)

因此,您剩下两个(常规)输入主题。

  1. Kafka Streams中的分区分配与常规使用者的分区分配不同。在您的情况下,每个主题有5个分区,将创建5个任务,并且每个任务将从一个输入主题中读取一个分区,例如,task-0将读取t1-p0和t3-p0,task-1将读取t1 -p1和t3-p1等。因此,如果按“用户名”对输入数据进行分区,则单个用户的所有数据将由同一任务处理。