
[英]How to use multiple consumers in different programming language for same group ID in Kafka
[英]Assign different group id to different consumers in the same application
我知道kafka流提供的并行性优势,如果您的并行性需求与主题划分保持一致,就会利用这些优势。
我正在考虑让一个应用程序将许多使用者订阅到不同的使用者组,以便每个使用者都在使用整个主题的副本。
具体来说,我正在考虑让多个线程使用同一主题来提供不同的结果,即使我知道我可以使用KStreams
提供的“链接”计算范例来表达我的所有计算需求。
我之所以考虑使用不同的线程,是因为我想要流的多个动态创建的KTable
实例。 每个人都在同一个流(不是子集)上工作,并汇总不同的结果。 由于它是动态的,因此可以创建非常重的负载,可以通过添加线程并行性来减轻负载。 我相信每个线程都可以在自己的流实例(和使用者组)上工作的想法是正确的。
当然,我也可以通过使多个线程消耗数据的较小子集并单独执行仍将提供并发性的所有计算(例如,每个维护所有不同KTables
子集)来添加线程并行性。
所以,我的问题有两个要点
KafkaStreams
通常不适合线程并行性吗,这意味着该库不打算以这种方式使用吗?
如果使用线程来消耗某个主题,那么最好使线程遵循通用的kafka并行性概念来处理数据的不同子集,因此使线程并行性成为应用程序级,类似于使用更多线程进行扩展。实例?
但是我想知道是否有一个应用程序可以使许多消费者订阅不同的消费者群体,这样每个消费者都可以使用整个主题的副本。
您可以考虑在同一个Java应用程序中运行多个KafkaStreams
实例。 每个实例都有自己的StreamsConfig
,因此也有自己的application.id
和使用者组ID。
就是说,根据您的用例,您可能要看一下GlobalKTable
( http://docs.confluent.io/current/streams/concepts.html#globalktable ),它(略有简化)可以确保从Kafka主题读取的数据在您的Kafka Streams应用程序的所有实例中都可用。 也就是说,这将使您可以“全局复制数据”,而不必运行多个KafkaStreams
实例或上面要求的更复杂的设置。
具体来说,我正在考虑让多个线程使用同一主题来提供不同类型的结果。 我可以以某种方式定义每个KafkaStream使用者正在收听的使用者组吗?
嗯,也许那时您正在寻找其他东西。
您知道可以从同一个KStream
和KTable
实例构建多个计算“链”吗?
KStream<String, Long> input = ...;
KTable<..., ...> firstChain = input.filter(...).groupByKey().count(...);
KTable<..., ...> secondChain = input.mapValues(...);
这样您就可以阅读一次Kafka主题,然后根据该主题计算不同的结果。
这通常被认为是一个坏主意吗?
如果我对您的理解正确,我认为有一种更好,更简单的方法,请参见上文。 如果您需要其他内容,则可能需要更新/澄清您的问题。
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.