在我们的架构中,我们假设在一台机器上运行三个jvm进程(大约),每台jvm机器最多可以托管15个kafka-stream应用程序。
如果我没记错的话,每个kafka-stream应用程序都会生成一个java线程。因此,这似乎是一个尴尬的架构,在一台机器上运行大约 45 个 kafka 流应用程序。
所以,我有三部分的问题
1)我的理解是否正确,每个kafka流应用程序都会生成一个java线程?此外,每个 kafka 流都与 kafka 代理启动新的 tcp 连接?
2)有没有办法为多个卡夫卡流共享一个TCP连接?
3)在单机上运行45个流是否困难(不推荐)? 答案肯定是否定的,除非生产中有一个真正的用例。
多个答案:
-
默认情况下,KafkaStreams 实例启动一个处理线程(您 也可以配置更多的处理线程)
-
在内部,KafkaStreams使用两个KafkaConsumer和一个KafkaProducer (如果你打开EOS,它会使用更多的KafkaProducers):一个KafkaConsumer 启动后台检测信号线程,KafkaProducer 启动 后台发送线程 =>您总共得到 4 个线程(正在处理,2 倍 检测信号,发送方)-- 如果配置两个处理线程,则结束 总共有 8 个线程,等等)
-
有多个 TCP 连接作为使用者和生产者 (和还原使用者,如果启用了待机任务)连接到 簇
-
无法共享任何TPC连接ATM(这需要 市长改写消费者和生产者)
-
您可以有效运行多少线程取决于您的硬件和 工作量。。。监控您的 CPU 利用率,看看您的机器是如何购买的......
- 每个 Kafka 流作业生成一个线程。如果线程编号为 设置为 n 个数字,它将在处理 n 个
Kafka 分区时提供并行性。 - 如果单台机器没有能力运行大量 线程,可以通过
在另一台机器中提交具有相同应用程序名称的 Streams 应用程序作业来实现并行性 在同一集群中。该作业将由 Kafka
流识别并在后台处理。 - 很难(不推荐)在单台机器上运行 45 个流 ?答案绝对是否定的,除非有真正的用途 在生产环境中的情况。--除非您的系统具有这么多内核 或者输入有 45 个分区,这不是必需的