Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在同一台机器上运行数百个卡夫卡消费者?_Java_Multithreading_Apache Kafka - Fatal编程技术网

Java 如何在同一台机器上运行数百个卡夫卡消费者?

Java 如何在同一台机器上运行数百个卡夫卡消费者?,java,multithreading,apache-kafka,Java,Multithreading,Apache Kafka,在Kafka文档中,提到消费者不是线程安全的。为了避免这个问题,我读到为每个Java进程运行消费者是一个好主意。如何做到这一点 消费者的数量没有定义,但可以根据需要进行更改 谢谢,, Alessio您是对的,文档指定Kafka使用者不是线程安全的。但是,它还说您应该在单独的线程上运行使用者, 而不是进程。那完全不同。有关针对Java/JVM的更详细的答案,请参见此处: 通常,在卡夫卡主题上,您可以拥有任意数量的消费者。其中一些可能共享一个组id,在这种情况下,该主题的所有分区将在任何时间点分布

在Kafka文档中,提到消费者不是线程安全的。为了避免这个问题,我读到为每个Java进程运行消费者是一个好主意。如何做到这一点

消费者的数量没有定义,但可以根据需要进行更改

谢谢,,
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的具体例子吗?我有几个,但我得把它们挖出来。上面的第二个缺点取决于用例,提交是最困难的部分,但是如果您有每处理器线程队列,则可以大大简化。其余的都很简单。我可以在今天晚些时候编辑我的帖子来添加一个例子。