如何编写Kafka使用者 - 单线程与多线程

时间:2018-04-26 21:00:28

标签: java multithreading deployment apache-kafka spring-kafka

我写了一个Kafka消费者(使用Spring Kafka),它从一个主题读取并且是消费者组的一部分。消息消耗后,它将执行所有下游操作并继续执行下一个消息偏移。我将其打包为WAR文件,我的部署管道将其推送到单个实例。使用我的部署管道,我可以将此工件部署到部署池中的多个实例。

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

  • 我实际上可以在部署池中定义多个实例 让所有这些实例都运行此WAR。这意味着,全部 他们正在听同一个话题,是同一个消费者的一部分 组,实际上将分区分开。该 下游逻辑将按原样运行。这对我来说非常好 用例,但是,我不确定,如果这是最佳方法 关注?

  • 在线阅读,我遇到了资源herehere, 人们在哪里定义一个消费者线程,但在内部, 创建多个工作线程。我们也有例子 可以定义执行下游逻辑的多个使用者线程。 考虑这些方法并将它们映射到部署 环境,我们可以达到相同的结果(就像我的理论 上面的解决方案可以),但机器数量较少。

就我个人而言,我认为我的解决方案简单,可扩展但可能不是最佳解决方案,而第二种方法可能是最佳的,但想知道您应该考虑的经验,建议或任何其他指标/约束?此外,我正在考虑我的理论解决方案,我实际上可以使用简单的机器作为Kafka消费者。

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

如果由于某种原因无法增加分区数但需要更高级别的并行性,您将只接近2。但是你需要担心订购和竞争条件。如果您需要走这条路线,我建议使用akka-stream-kafka库,它提供正确处理偏移提交的工具,并行地执行您需要的工作,然后合并回单个流,保留原始顺序,等等。否则,这些事情很容易自己做。