繁体   English   中英

消息处理Kafka的多个节点

[英]multiple nodes for message processing Kafka

我们有一个 spring 启动应用程序部署在 Kubernetes 上,它处理消息:它从 Kafka 主题读取,然后进行一些映射,最后,它写入 Kafka 主题

为了获得更高的性能,我们需要更快地处理消息,因此我们引入了这个 spring 启动应用程序的多个节点。

但我相信这会导致问题,因为:

  • 消息应按顺序处理

  • 该消息包含 state

是否有任何解决方案可以使消息保持有序,并保证一个节点已经处理的消息不会被另一个节点处理,并解决由多个节点处理引起的任何其他问题。

请随时提出所有可能的解决方案,因为我们正在构建 POC。

使用 apache flink 或 spring-cloud-stream 对这件事有帮助吗?

在消费来自 Kafka 的消息时,记住消费者组的概念很重要。 这个概念确保从 Kafka 主题读取并共享同一个 Consumer Group 的节点不会相互干扰。 消费者组中的一个消费者已阅读的内容将不会被同一消费者组的另一消费者再次阅读。

此外,读取和写入 Kafka 的应用程序随 Kafka 主题中的分区数量而扩展。

如果您有多个节点使用只有一个分区的主题,则不会有任何影响,因为一个分区只能从消费者组中的单个消费者读取。 您将在有关Consumers的 Kafka 文档中找到更多信息。

当您有一个包含多个分区的主题时,排序可能会成为一个问题。 Kafka 只保证分区内的顺序。

这是 Kafka 文档的摘录,描述了消费者组和分区之间的交互

通过在主题中拥有并行概念(分区),Kafka 能够在消费者进程池上提供排序保证和负载平衡。 这是通过将主题中的分区分配给消费者组中的消费者来实现的,以便每个分区仅由组中的一个消费者使用。 通过这样做,我们确保消费者是该分区的唯一读取者并按顺序使用数据。 由于有许多分区,这仍然可以平衡许多消费者实例的负载。 但是请注意,消费者组中的消费者实例不能多于分区。

使用 Flink 进行扩展的限制将是 Kafka 主题中的分区数量——换句话说,Flink 的 Kafka 消费者的每个实例都将连接到一个或多个分区并从中读取。 使用 Flink,除非您重新分区数据,否则将保留顺序。 Flink 确实提供了exactly-once 的保证。

一起体验 Flink 和 Kafka 的快速方法是探索 Flink 的操作游乐场 这个 dockerized 游乐场的设置是为了让您探索重新缩放、故障恢复等,并且应该使这一切更加具体。

您可以在单个应用程序中运行多个使用者线程,甚至可以使用多个使用者线程运行多个应用程序。 当所有消费者属于同一个组并且 Kafka 主题有足够的分区时,Kafka 会在主题分区之间进行平衡。

一个分区中的消息始终是有序的,但要通过消息键保持顺序,您应该设置max.in.flight.requests.per.connection=1 代理总是在同一个分区中写入具有相同键的消息(除非您更改分区号),因此您将对具有相同键的所有消息进行排序。

一个分区由唯一的一个消费者读取,因此当另一个消费者获得处理的消息时,唯一的方法是在消息被确认之前重新平衡分区。 您可以设置ack-mode=MANUAL_IMMEDIATE并在处理后立即确认消息或使用其他确认方法。

我建议阅读这篇文章https://medium.com/@felipedutratine/kafka-ordering-guarantees-99320db8f87f

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM