【发布时间】:2020-11-14 23:23:35
【问题描述】:
我有一个有状态的应用程序来维护与用户的会话。此应用程序有 5 个实例。
以下是主题:
所有主题都有 5 个分区。
topic1topic2topic3
Topic1 和 topic2 分别用于构建状态存储和全局 ktable。两个主题都使用用户名作为消息键。这些主题中的数据由应用程序实例本身生成。
现在另一个应用程序使用与消息键相同的用户名向 topic3 生成数据。
我的期望是,它将转到在其本地状态存储中拥有该用户的实例所使用的同一分区。是这样吗?
对于每条消息,它还应该由拥有此用户会话的其他实例处理。那么如果实例发现其他实例监听的分区并将消息转发给其他分区,是否设计正确?
这是可扩展的设计,还是最好将所有消息广播到所有分区(差异消费者组)并由实例决定是否处理它
【问题讨论】:
-
根据全局 ktable 的定义,如果本地节点没有您要查找的数据,实例将远程协调哪个节点可以正确查询。因此,不确定哪个消费者获取数据是否重要。关于问题标题:是的,如果您使用自定义分区器
-
重要的是哪个实例得到它。所有拥有用户会话的实例都必须得到消息。我认为我们需要实施自定义解决方案以将相同的消息重新发送到多个分区。卡夫卡还有其他可能吗?
-
你在问两件事。 1)你可以将数据发送到多个分区吗?是的,使用自定义分区器。否则,相同的事件总是进入相同的分区。您也可以将特定分区分配给消费者,尽管不在 KStreams 中。 2) 对远程状态存储的 RPC 调用是 GlobalKTables 上的 KStreams 文档中的一种模式;如果密钥不在本地,它将远程获取,因此对所有商店实例进行“全局”查找
-
远程存储中的 RPC 查找不是我的问题。有两种方法可以实现向多个实例发送消息 - 1)为实例使用不同的消费者组,让所有实例接收所有消息并忽略不需要的消息。 2)使用状态存储来查找应该处理的实例分区,然后手动发送到特定分区。哪个效率高?
-
只是为了澄清发送到特定分区不是基于状态存储中的密钥存在,而是基于应用程序特定的用户会话
标签: apache-kafka apache-kafka-streams