我有一些基本的Kafka Streaming代码,它从一个主题读取记录,进行一些处理,并将记录输出到另一个主题.
Kafka流如何处理并发?一切都在一个线程中运行吗?我没有在文档中看到这一点.
如果它是单线程的,我希望多线程处理的选项能够处理大量数据.
如果它是多线程的,我需要了解它是如何工作的以及如何处理资源,比如SQL数据库连接应该在不同的处理线程中共享.
相对于其他选项(Spark,Akka,Samza,Storm等),Kafka的内置流API是否不推荐用于高容量场景?
Kafka流如何处理并发?一切都在一个线程中运行吗?我没有在文档中看到这一点.
这在http://docs.confluent.io/current/streams/architecture.html#parallelism-model中有详细记录.我不想在此逐字复制粘贴,但我想强调IMHO要理解的关键元素是分区(参见Kafka的主题分区,在Kafka Streams中将其推广为"流分区"并非全部正在处理的数据流将通过Kafka)因为分区当前决定了Kafka(代理/服务器端)和使用Kafka Streams API(客户端)的流处理应用程序的并行性.
如果它是单线程的,我希望多线程处理的选项能够处理大量数据.
处理分区将始终只由一个"线程"完成,这可确保您不会遇到并发问题.但...
如果它是多线程的,我需要了解它是如何工作的以及如何处理资源,比如SQL数据库连接应该在不同的处理线程中共享.
...因为Kafka允许主题有许多分区,所以你得到并行处理.例如,如果一个主题有100个分区,那么最多100个流任务(或者,有些过于简化:每个运行应用程序实例的多达100个不同的机器)可以并行处理该主题.同样,每个流任务都将获得对1分区的独占访问权,然后它将处理该分区.
相对于其他选项(Spark,Akka,Samza,Storm等),Kafka的内置流API是否不推荐用于高容量场景?
肯定推荐使用Kafka的流处理引擎,实际上也可以在高容量场景中使用它.关于比较基准测试的工作仍在进行中,但在许多情况下,基于Kafka Streams的应用程序变得更快.请参阅LINE工程师的博客:将LINE Kafka Streams应用于内部消息传递管道,以获取LINE Corp(亚洲最大的社交平台之一(220M +用户))的文章,其中描述了他们如何在生产中使用Kafka和Kafka Streams API进行处理每秒数百万个事件.
kstreams config num.stream.threads 允许您覆盖1中的线程数.但是,最好只运行流应用程序的多个实例,所有实例都运行相同的使用者组.这样,您可以根据需要调整尽可能多的实例以获得最佳分区.