2020 年 10 月更新:我写了一个由四部分组成的关于 Kafka 基础知识的博客系列,我建议您阅读此类问题。特别是对于这个问题,请看一下关于处理基础的第 3 部分。
对于你的问题:
Kafka 流如何处理并发?一切都在一个线程中运行吗?我没有在文档中看到这一点。
这在http://docs.confluent.io/current/streams/architecture.html#parallelism-model中有详细记录。我不想在这里逐字复制粘贴,但我想强调,恕我直言,要理解的关键元素是分区(参见 Kafka 的主题分区,在 Kafka Streams 中,它被概括为“流分区”,因为并非全部正在处理的数据流将通过 Kafka),因为分区当前决定了 Kafka(代理/服务器端)和使用 Kafka Streams API(客户端)的流处理应用程序的并行性。
如果它是单线程的,我想要多线程处理的选项来处理大量数据。
处理分区将始终仅由单个“线程”完成,这确保您不会遇到并发问题。但...
如果它是多线程的,我需要了解它是如何工作的以及如何处理资源,比如 SQL 数据库连接应该在不同的处理线程中共享。
...因为 Kafka 允许一个主题有许多分区,所以您可以进行并行处理。例如,如果一个主题有 100 个分区,那么多达 100 个流任务(或者,有些过于简单化:多达 100 台不同的机器,每台运行您的应用程序的实例)可以并行处理该主题。同样,每个流任务都将获得对 1 个分区的独占访问权,然后它将对其进行处理。
相对于其他选项(Spark、Akka、Samza、Storm 等),是否不建议将 Kafka 的内置流 API 用于大容量场景?
Kafka 的流处理引擎是绝对值得推荐的,实际上它也被用于大容量场景。比较基准测试的工作仍在进行中,但在许多情况下,基于 Kafka Streams 的应用程序会更快。请参阅LINE 工程师的博客:将 Kafka Streams 用于内部消息传递管道,这是 LINE Corp 的一篇文章,该文章是亚洲最大的社交平台之一(超过 2.2 亿用户),其中描述了他们如何在生产中使用 Kafka 和 Kafka Streams API 来处理每秒数百万个事件。