Java 如何在同一台机器上运行数百个卡夫卡消费者?
在Kafka文档中,提到消费者不是线程安全的。为了避免这个问题,我读到为每个Java进程运行消费者是一个好主意。如何做到这一点 消费者的数量没有定义,但可以根据需要进行更改 谢谢,,Java 如何在同一台机器上运行数百个卡夫卡消费者?,java,multithreading,apache-kafka,Java,Multithreading,Apache Kafka,在Kafka文档中,提到消费者不是线程安全的。为了避免这个问题,我读到为每个Java进程运行消费者是一个好主意。如何做到这一点 消费者的数量没有定义,但可以根据需要进行更改 谢谢,, Alessio您是对的,文档指定Kafka使用者不是线程安全的。但是,它还说您应该在单独的线程上运行使用者, 而不是进程。那完全不同。有关针对Java/JVM的更详细的答案,请参见此处: 通常,在卡夫卡主题上,您可以拥有任意数量的消费者。其中一些可能共享一个组id,在这种情况下,该主题的所有分区将在任何时间点分布
Alessio您是对的,文档指定Kafka使用者不是线程安全的。但是,它还说您应该在单独的线程上运行使用者, 而不是进程。那完全不同。有关针对Java/JVM的更详细的答案,请参见此处: 通常,在卡夫卡主题上,您可以拥有任意数量的消费者。其中一些可能共享一个组id,在这种情况下,该主题的所有分区将在任何时间点分布在所有活动的使用者中 关于Kafka消费者的Javadoc有更多的细节,链接在这个答案的底部,但是我复制了下面文档中建议的两个线程/消费者模型 1。每个线程一个消费者 一个简单的选择是为每个线程提供自己的使用者实例。在这里 这种方法的优点和缺点是: PRO:这是最容易实现的 PRO:它通常是最快的,因为不需要线程间的协调 PRO:它使得基于每个分区的顺序处理非常容易实现(每个线程只按照接收消息的顺序处理消息) CON:更多使用者意味着更多到集群的TCP连接(每个线程一个)。一般来说,卡夫卡处理连接的效率非常高,所以这通常是一个小成本 CON:多个使用者意味着向服务器发送更多的请求,而对数据的批处理稍微少一些,这可能会导致I/O吞吐量下降 CON:所有进程的线程总数将受到分区总数的限制 2。将消耗和处理解耦 另一种选择是让一个或多个使用者线程 所有数据消耗和转交消费者将实例记录到 阻塞由处理器线程池消耗的队列 处理记录处理。这一方案也有其优点和缺点: PRO:此选项允许独立扩展消费者数量 和处理器。这使得单个消费者能够 馈送多个处理器线程,避免分区上的任何限制 CON:保证处理器之间的订单需要特别小心 由于线程将独立执行,因此可能需要一个较早的数据块 实际上,由于运气的原因,在以后的数据块之后会被处理 线程执行时间的定义。用于无订单的处理 要求这不是问题 CON:手动提交 位置变得更加困难,因为它要求所有螺纹与 确保该分区的处理已完成。有很多 这种方法的可能变化。例如,每个处理器 线程可以有自己的队列,使用者线程可以散列到 这些队列使用TopicPartition来确保有序消费 简化提交 根据我的经验,选项1最适合起步,只有在您真正需要时,才可以升级到选项2。选项#2是从kafka使用者获取最大性能的唯一方法,但其实现更为复杂。因此,首先尝试一下选项1,看看它是否适合您的特定用例 完整的Javadoc可通过以下链接获得:
你有选项2的具体例子吗?我有几个,但我得把它们挖出来。上面的第二个缺点取决于用例,提交是最困难的部分,但是如果您有每处理器线程队列,则可以大大简化。其余的都很简单。我可以在今天晚些时候编辑我的帖子来添加一个例子。