Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 如何编写Kafka消费者-单线程与多线程_Java_Multithreading_Deployment_Apache Kafka_Spring Kafka - Fatal编程技术网

Java 如何编写Kafka消费者-单线程与多线程

Java 如何编写Kafka消费者-单线程与多线程,java,multithreading,deployment,apache-kafka,spring-kafka,Java,Multithreading,Deployment,Apache Kafka,Spring Kafka,我编写了一个Kafka消费者(使用Spring Kafka),它从一个主题阅读,并且是消费者群体的一部分。一旦消息被使用,它将执行所有下游操作并转到下一个消息偏移量。我已将其打包为WAR文件,部署管道将其推出到单个实例。使用部署管道,我可以潜在地将此工件部署到部署池中的多个实例 但是,当我希望将多个消费者作为我的基础设施的一部分时,我无法理解以下内容: 实际上,我可以在部署池中定义多个实例 让这场战争在所有这些情况下进行。这意味着,所有的 他们在听同一个话题,是同一个消费者的一部分 组,并将实

我编写了一个Kafka消费者(使用Spring Kafka),它从一个主题阅读,并且是消费者群体的一部分。一旦消息被使用,它将执行所有下游操作并转到下一个消息偏移量。我已将其打包为WAR文件,部署管道将其推出到单个实例。使用部署管道,我可以潜在地将此工件部署到部署池中的多个实例

但是,当我希望将多个消费者作为我的基础设施的一部分时,我无法理解以下内容:

  • 实际上,我可以在部署池中定义多个实例 让这场战争在所有这些情况下进行。这意味着,所有的 他们在听同一个话题,是同一个消费者的一部分 组,并将实际在它们之间划分分区。这个 下游逻辑将按原样工作。这对我的工作非常好 然而,我不确定这是否是解决问题的最佳方法 跟着

  • 在网上阅读时,我发现了一些资源, 在这里,人们定义一个单一的消费者线索,但在内部, 创建多个工作线程。还有一些例子说明我们 可以定义执行下游逻辑的多个使用者线程。 思考这些方法并将其映射到部署 环境,我们可以达到同样的结果(正如我的理论 上述解决方案可以),但机器数量较少

P>个人认为,我的解决方案是简单的,可扩展的,但可能不是最优的,而第二种方法可能是最优的,但是想知道你的经验、建议或其他我应该考虑的度量/约束条件吗?此外,我在考虑我的理论解决方案,我实际上可以使用简单的机器作为卡夫卡的消费者


虽然我知道,但我还没有发布任何代码,如果我需要将此问题转移到其他论坛,请告诉我。如果您需要特定的代码示例,我也可以提供它们,但在我的问题中,我认为它们并不重要。

您现有的解决方案是最好的。转移到另一个线程将导致偏移管理出现问题。Spring kafka允许您在每个实例中运行多个线程,只要您有足够的分区。

如果您当前的方法有效,请坚持使用它。这是一种简单而优雅的方式


如果由于某种原因不能增加分区的数量,但需要更高级别的并行性,则只能使用方法2。但是你要担心的是秩序和比赛条件。如果您需要这样做,我建议您使用库,它提供了正确处理偏移提交的工具,可以并行执行您需要的操作,然后合并回一个流,保留原始顺序,等等,这些事情你自己很容易出错。

你的建议实际上暗示了第二种解决方案。在我现有的解决方案中,我有一个单线程使用者,部署到多个实例。然而,使用SpringKafka,如果我可以在一个WAR中轻松定义多个线程并将此WAR部署到多个实例,那么我将优化现有的解决方案。我相信您指的是使用
ConcurrentKafkListenerContainerFactory
,并能够根据我的主题分区设置并发性。此外,由于Spring正在管理消费线程,因此消费线程管理将有一个更干净的生命周期?否;这是错误的解释;您的第二个项目符号是
,其中人们定义一个消费者线程,但在内部创建多个工作者线程。对于并发容器,每个使用者都有一个单独的
使用者
实例(和线程)。没有将任务交给“工作者”线程的概念。这相当于在每次战争中都有
n
容器(实际上是并发容器中发生的事情)。感谢您提供的信息!现在,因为我也能够定义主题分区,所以我可以在容量方面谨慎地向前看。但是,是的,我会记住这个工具,以防将来需要它。