.net - 如何在 .Net 分布式应用程序中加入多个 Kafka 主题
问题描述
我将 Kafka 与 .Net Core 一起使用,我有 2 个主题。其中两者都包含来自同一实体的信息并由相同的键进行分区。
在我的申请中,我想Join
同时处理这两种信息。此过程在内存中,因为它需要相当低的延迟。
我的应用程序有多个节点正在运行,所以当一个节点启动时,它被分配了来自第一个主题的一些分区T1
(比如T1:P1
, T1:P3
)和来自另一个主题的一些分区T2
(比如T2:P2
, T2:P4
)
我的问题是我不能保证单个应用程序节点将被分配来自两个主题的同一实体的分区。给定的实体可能最终出现在T1:P1
第一个主题和T2:P3
第二个主题上。在上面的示例中,我无法将它们混合在一起。
我知道我可以在生产者端使用一致的分区器,因此至少我知道我的实体最终在两个主题上的相同分区号上(例如T1:P1
,T2:P1
)。它仍然对我没有帮助,因为我可以分配任何分区。
Kafka Streams 似乎适合这种情况,但它仍然没有 .net 的实现。
我想到了一些可能的解决方案:
- 在消费者上,让kafka客户端分配分区
T1
,并在回调中PartitionsAssigned
手动分配相同的分区T2
。 - 使服务无状态,并使用数据库。在每条新消息上保存/检索状态。
- 在我的特殊情况下,
T1
频率非常高而且T2
少得多。我正在考虑从T2
每个节点上读取所有分区(例如,使用随机 groupId)。
但所有解决方案都存在问题:
- 在策略 (1) 上,我对
T2
在分区重新平衡期间丢失消息持谨慎态度。 - 策略 (2) 会引入延迟,这是我真的不想要的。即使使用 redis 例如它也可能成为一个问题。
- 解决方案 (3) 根本无法扩展。这次我也许可以做到,但它会给我的所有节点带来一些内存压力。
还有其他我没有想到的解决方案吗?
解决方案
推荐阅读
- python - 正则表达式搜索仅适用于我的一半文件,即使所有条目的格式相同
- json - 在外部文件创建/更新时触发 Snackbar
- android - 使用 Toothpick DI 注入仿制药
- python-3.x - 没有名为 tbb 的模块
- pascal - 自由帕斯卡无法写入文本文件
- java - Spring Boot - GetMapping 到具有不同路径的相同方法的更简单方法
- python - I want to copy DynamoDB table from one account to another using boto3 in python. but error is showing up
- unity3d - 对象的 UNITY.PUN.Spawn 点
- kubernetes - kubernetes OOMKilled 的原因
- docker - 将 Persistent 卷挂载到已经存在的 pod