首页 > 解决方案 > 如何在 .Net 分布式应用程序中加入多个 Kafka 主题

问题描述

我将 Kafka 与 .Net Core 一起使用,我有 2 个主题。其中两者都包含来自同一实体的信息并由相同的键进行分区。

在我的申请中,我想Join同时处理这两种信息。此过程在内存中,因为它需要相当低的延迟。

我的应用程序有多个节点正在运行,所以当一个节点启动时,它被分配了来自第一个主题的一些分区T1(比如T1:P1, T1:P3)和来自另一个主题的一些分区T2(比如T2:P2, T2:P4

我的问题是我不能保证单个应用程序节点将被分配来自两个主题的同一实体的分区。给定的实体可能最终出现在T1:P1第一个主题和T2:P3第二个主题上。在上面的示例中,我无法将它们混合在一起。

我知道我可以在生产者端使用一致的分区器,因此至少我知道我的实体最终在两个主题上的相同分区号上(例如T1:P1T2:P1)。它仍然对我没有帮助,因为我可以分配任何分区。

Kafka Streams 似乎适合这种情况,但它仍然没有 .net 的实现

我想到了一些可能的解决方案:

  1. 在消费者上,让kafka客户端分配分区T1,并在回调中PartitionsAssigned手动分配相同的分区T2
  2. 使服务无状态,并使用数据库。在每条新消息上保存/检索状态。
  3. 在我的特殊情况下,T1频率非常高而且T2少得多。我正在考虑从T2每个节点上读取所有分区(例如,使用随机 groupId)。

但所有解决方案都存在问题:

还有其他我没有想到的解决方案吗?

标签: .netapache-kafka

解决方案


推荐阅读