繁体   English   中英

如何在同一台机器上运行数百名Kafka消费者?

[英]How to run hundreds of Kafka consumers on the same machine?

在Kafka文档中,提到消费者不是线程安全的。 为了避免这个问题,我读到为每个Java进程运行一个使用者是个好主意。 怎么能实现这一目标?

消费者的数量没有定义,但可以根据需要改变。

谢谢,Alessio

您的文档指定Kafka使用者不是线程安全的,这是对的。 但是,它还说你应该在不同的线程而不是进程上运行使用者。 那是完全不同的。 请参阅此处以获取更具体的答案,面向Java / JVM: https//stackoverflow.com/a/15795159/236528

通常,您可以在Kafka主题上拥有任意数量的消费者。 其中一些可能共享组ID ,在这种情况下,该主题的所有分区将分布在任何时间点活动的所有消费者中。

关于Kafka Consumer的Javadoc有更多细节,链接在这个答案的底部,但我复制了下面文档中建议的两个线程/消费者模型。

1.每个线程一个消费者

一个简单的选择是为每个线程提供自己的消费者实例。 以下是此方法的优缺点:

PRO:这是最容易实现的

PRO:它通常是最快的,因为不需要线程间的协调

PRO:它使每个分区的有序处理非常容易实现(每个线程只按接收顺序处理消息)。

CON:更多的消费者意味着与群集的TCP连接更多(每个线程一个)。 一般来说,Kafka非常有效地处理连接,因此这通常是一个很小的成本。

CON:多个使用者意味着更多的请求被发送到服务器,而数据的批量略少,这可能导致I / O吞吐量的一些下降。

CON:所有进程中的总线程数将受到分区总数的限制。

2.消耗和加工

另一种方法是让一个或多个消费者线程执行所有数据消耗,并将ConsumerRecords实例移交给实际处理记录处理的处理器线程池所消耗的阻塞队列。 这个选项同样有利有弊:

PRO:此选项允许独立扩展消费者和处理器的数量。 这使得可以让单个消费者提供许多处理器线程,从而避免对分区的任何限制。

CON:保证处理器之间的顺序需要特别小心,因为线程将独立执行,因为线程执行时间的好运,实际上可以在稍后的数据块之后处理较早的数据块。 对于没有订购要求的处理,这不是问题。

CON:手动提交位置变得更加困难,因为它要求所有线程协调以确保该分区的处理完成。 这种方法有许多可能的变化。 例如,每个处理器线程可以拥有自己的队列,并且使用者线程可以使用TopicPartition散列到这些队列中,以确保按顺序使用并简化提交。

根据我的经验,选项#1是最好的开始,只有在您真正需要时才能升级到选项#2。 选项#2是从kafka消费者中提取最大性能的唯一方法,但其实现更复杂。 因此,首先尝试选项#1,看看它是否足以满足您的特定用例。

完整的Javadoc可以在以下链接获得: https//kafka.apache.org/23/javadoc/index.html? org /apache / kafka / client / cosumer / KafkaConsumer.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM