【问题标题】:Can we resend messages to multiple Kafka partitions我们可以将消息重新发送到多个 Kafka 分区吗
【发布时间】:2020-11-14 23:23:35
【问题描述】:

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

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

topic1
topic2
topic3

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

现在另一个应用程序使用与消息键相同的用户名向 topic3 生成数据。

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

对于每条消息,它还应该由拥有此用户会话的其他实例处理。那么如果实例发现其他实例监听的分区并将消息转发给其他分区,是否设计正确?

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

【问题讨论】:

  • 根据全局 ktable 的定义,如果本地节点没有您要查找的数据,实例将远程协调哪个节点可以正确查询。因此,不确定哪个消费者获取数据是否重要。关于问题标题:是的,如果您使用自定义分区器
  • 重要的是哪个实例得到它。所有拥有用户会话的实例都必须得到消息。我认为我们需要实施自定义解决方案以将相同的消息重新发送到多个分区。卡夫卡还有其他可能吗?
  • 你在问两件事。 1)你可以将数据发送到多个分区吗?是的,使用自定义分区器。否则,相同的事件总是进入相同的分区。您也可以将特定分区分配给消费者,尽管不在 KStreams 中。 2) 对远程状态存储的 RPC 调用是 GlobalKTables 上的 KStreams 文档中的一种模式;如果密钥不在本地,它将远程获取,因此对所有商店实例进行“全局”查找
  • 远程存储中的 RPC 查找不是我的问题。有两种方法可以实现向多个实例发送消息 - 1)为实例使用不同的消费者组,让所有实例接收所有消息并忽略不需要的消息。 2)使用状态存储来查找应该处理的实例分区,然后手动发送到特定分区。哪个效率高?
  • 只是为了澄清发送到特定分区不是基于状态存储中的密钥存在,而是基于应用程序特定的用户会话

标签: apache-kafka apache-kafka-streams


【解决方案1】:

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

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

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

  1. Kafka Streams 中的分区分配不同于普通消费者的分区分配。在您的情况下,每个主题有 5 个分区,将创建 5 个任务,每个任务将从一个输入主题读取一个分区,例如,任务 0 将读取 t1-p0 和 t3-p0,任务 1 将读取 t1 -p1 和 t3-p1 等。因此,如果您的输入数据按“用户名”分区,则单个用户的所有数据都将由同一任务处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多