Kafka 流并发?

Kafka Streaming Concurrency?

我有一些基本的 Kafka Streaming 代码,可以从一个主题读取记录,进行一些处理,然后将记录输出到另一个主题。

Kafka Streaming是如何处理并发的?所有 运行 都在一个线程中吗?我没有在文档中看到这一点。

如果是单线程,我想要多线程处理选项来处理大量数据。

如果它是多线程的,我需要了解它是如何工作的以及如何处理资源,例如 SQL 数据库连接应该在不同的处理线程中共享。

相对于其他选项(Spark、Akka、Samza、Storm 等),Kafka 的内置流 API 不推荐用于大容量场景吗?

kstreams 配置 num.stream.threads 允许您覆盖 1 的线程数。但是,简单地 运行 多个实例可能更可取您的流媒体应用程序,所有这些应用程序 运行 属于同一个消费者群体。这样您就可以启动尽可能多的实例以获得最佳分区。

2020 年 10 月更新: 我写了一个 four-part blog series on Kafka fundamentals that I'd recommend to read for questions like these. For this question in particular, take a look at part 3 on processing fundamentals.

针对您的问题:

How does Kafka streaming handle concurrency? Is everything run in a single thread? I don't see this mentioned in the documentation.

这在 http://docs.confluent.io/current/streams/architecture.html#parallelism-model 中有详细记录。我不想在此处逐字复制粘贴,但我想强调恕我直言,要理解的关键要素是 partitions(参见 Kafka 的主题分区,在 Kafka Streams 中被概括为“流分区”,因为并非所有正在处理的数据流都将通过 Kafka),因为分区目前决定​​了 Kafka(broker/server 端)和使用的流处理应用程序的并行性Kafka Streams API(客户端)。

If it's single threaded, I would like options for multi-threaded processing to handle high volumes of data.

处理分区将始终仅由单个“线程”完成,这确保您不会运行陷入并发问题。但是...

If it's multi-threaded, I need to understand how this works and how to handle resources, like SQL database connections should be shared in different processing threads.

...因为 Kafka 允许一个主题有很多分区,所以你可以并行处理。例如,如果一个主题有 100 个分区,那么最多 100 个流任务(或者,有点过于简化:最多 100 台不同的机器,每台 运行 您的应用程序实例)可以并行处理该主题。同样,每个流任务都将获得对 1 个分区的独占访问权,然后处理该分区。

Is Kafka's built-in streaming API not recommended for high volume scenarios relative to other options (Spark, Akka, Samza, Storm, etc)?

Kafka的流处理引擎绝对值得推荐,并且在大容量场景中也有实际使用。比较基准测试的工作仍在进行中,但在许多情况下,基于 Kafka Streams 的应用程序被证明更快。请参阅 LINE engineer's blog: Applying Kafka Streams for internal message delivery pipeline LINE Corp 的一篇文章,LINE Corp 是亚洲最大的社交平台之一(超过 2.2 亿用户),他们在文中描述了他们如何在生产环境中使用 Kafka 和 Kafka Streams API 来处理数百万个事件每秒。