我有一些基本的kafka流式代码,从一个主题读取记录,进行一些处理,并将记录输出到另一个主题。
kafka流如何处理并发性?一切都在一个线程中运行吗?我没有看到文件中提到这一点。
如果是单线程的,我希望多线程处理的选项可以处理大量的数据。
如果是多线程的,我需要了解它是如何工作的,以及如何处理资源,比如sql数据库连接应该在不同的处理线程中共享。
相对于其他选项(spark、akka、samza、storm等),kafka的内置流式api是否不推荐用于高容量场景?
我有一些基本的kafka流式代码,从一个主题读取记录,进行一些处理,并将记录输出到另一个主题。
kafka流如何处理并发性?一切都在一个线程中运行吗?我没有看到文件中提到这一点。
如果是单线程的,我希望多线程处理的选项可以处理大量的数据。
如果是多线程的,我需要了解它是如何工作的,以及如何处理资源,比如sql数据库连接应该在不同的处理线程中共享。
相对于其他选项(spark、akka、samza、storm等),kafka的内置流式api是否不推荐用于高容量场景?
2条答案
按热度按时间esbemjvw1#
kstreams config num.stream.threads允许您覆盖1中的线程数。不过,最好只是运行流媒体应用的多个示例,所有示例都运行相同的用户组。这样,您就可以根据需要启动尽可能多的示例来获得最佳分区。
wz8daaqr2#
更新2020年10月:我写了一个关于Kafka基本原理的四部分博客系列,我建议你阅读这些问题。特别是对于这个问题,请看第3部分“处理基础知识”。
对于你的问题:
kafka流如何处理并发性?一切都在一个线程中运行吗?我没有看到文件中提到这一点。
详细记录如下:http://docs.confluent.io/current/streams/architecture.html#parallelism-模型。我不想一字不差地复制粘贴到这里,但我想强调的是,要理解的关键元素是分区(参见Kafka的主题分区,它在kafka流中被泛化为“流分区”,因为不是所有正在处理的数据流都将通过kafka),因为分区当前决定了kafka(代理/服务器端)和使用kafka流api的流处理应用程序(客户端)的并行性。
如果是单线程的,我希望多线程处理的选项可以处理大量的数据。
处理分区总是只由一个“线程”来完成,这可以确保您不会遇到并发问题。但是。。。
如果是多线程的,我需要了解它是如何工作的,以及如何处理资源,比如sql数据库连接应该在不同的处理线程中共享。
…因为kafka允许一个主题有多个分区,所以可以进行并行处理。例如,如果一个主题有100个分区,那么最多100个流任务(或者,有些过于简化:最多100个不同的机器,每个机器运行一个应用程序示例)可以并行处理该主题。同样,每个流任务将获得对1个分区的独占访问权,然后它将处理该分区。
相对于其他选项(spark、akka、samza、storm等),kafka的内置流式api是否不推荐用于高容量场景?
kafka的流处理引擎是绝对值得推荐的,而且在实际中也被用于大量场景。比较基准测试的工作仍在进行中,但在许多情况下,基于kafka流的应用程序速度更快。请参阅line engineer的博客:applying kafka streams for internal message delivery pipeline的一篇文章。line corp是亚洲最大的社交平台之一(2.2亿以上用户),他们在文章中描述了如何在生产中使用kafka和kafka streams api每秒处理数百万个事件。