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

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

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

  • 我实际上可以在部署池中定义多个实例,并在所有这些实例上运行此 WAR。这意味着,他们都在听同一个话题,是同一个消费者群体的一部分,实际上会划分他们之间的分区。下游逻辑将按原样工作。这对于我的用例来说完全可以正常工作,但是,我不确定,这是否是最佳方法?

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

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

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


答案 1

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


答案 2

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

只有在由于某种原因无法增加分区数但需要更高级别的并行性的情况下,才会转到接近 2。但是,您需要担心订购和竞争条件。如果你需要走这条路,我会推荐akka-stream-kafka库,它提供了正确处理偏移提交的工具,并并行执行你需要的事情,然后合并回单个流,保留原始排序,等等。否则,这些事情很容易出错。