![](/img/trans.png)
[英]How to run multiple kafka consumers on the same box independent of each other?
[英]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.