用于消息处理的多个节点kafka

kgqe7b3p  于 2021-06-04  发布在  Kafka
关注(0)|答案(3)|浏览(373)

我们在kubernetes上部署了一个spring引导应用程序,它处理消息:它读取kafka主题,然后进行一些Map,最后写入kafka主题
为了获得更高的性能,我们需要更快地处理消息,因此我们引入了这个spring引导应用程序的多个节点。
但我相信这会导致一个问题,因为:
消息应该按顺序处理
消息包含一个状态
是否有任何解决方案来保持消息的有序性,并保证一个节点已经处理的消息不会被另一个节点处理,以及解决由多个节点中的处理引起的任何其他问题。
请随时解决所有可能的解决方案,因为我们正在建立一个poc。
使用ApacheFlink或SpringCloud流对这个问题有帮助吗?

ttygqcqt

ttygqcqt1#

使用flink进行扩展的限制是kafka主题中的分区数——换句话说,flink的kafka使用者的每个示例都将连接到一个或多个分区并从中读取。使用flink,除非对数据进行重新分区,否则将保留顺序。Flink确实提供了一次确切的保证。
一个快速体验Flink和Kafka一起行动的方法是探索Flink的行动操场。这个停靠的操场是为了让你探索重缩放、故障恢复等,应该让这一切更加具体。

6kkfgxo0

6kkfgxo02#

当消费Kafka的信息时,一定要记住消费群体的概念。这个概念确保了从Kafka主题读取并共享同一消费群体的节点不会相互干扰。消费者组中的一个消费者读取的内容将不会被同一消费者组中的另一个消费者再次读取。
此外,对kafka进行读写的应用程序会随着kafka主题中分区的数量而扩展。
如果多个节点只使用一个分区来访问一个主题,则不会产生任何影响,因为一个分区只能从使用者组中的单个使用者读取。您将在Kafka文档中找到有关消费者的更多信息。
当一个主题有多个分区时,排序可能会成为一个问题。Kafka只保证分区内的秩序。
以下是kafka文档的摘录,描述了消费群体和分区之间的交互:
通过在主题中具有分区并行性的概念,kafka能够在消费进程池上提供排序保证和负载平衡。这是通过将主题中的分区分配给使用者组中的使用者来实现的,这样每个分区只由组中的一个使用者使用。通过这样做,我们可以确保使用者是该分区的唯一读取器,并按顺序使用数据。由于有许多分区,这仍然平衡了许多使用者示例的负载。但是请注意,在使用者组中,使用者示例不能多于分区。

a0zr77ik

a0zr77ik3#

您可以在单个应用程序中运行多个使用者线程,甚至可以使用多个使用者线程运行多个应用程序。当所有消费者都属于同一个组并且kafka主题有足够的分区时,kafka将在主题分区之间进行平衡。
一个分区中的消息总是按顺序排列的,但是要按消息键保持顺序,应该设置 max.in.flight.requests.per.connection=1 . 代理总是在同一分区中写入具有相同密钥的消息(除非您更改分区号),因此您将对具有相同密钥的所有消息进行排序。
只有一个使用者读取一个分区,因此当另一个使用者得到处理的消息时,唯一的方法是在消息被确认之前重新平衡分区。你可以设置 ack-mode=MANUAL_IMMEDIATE 以及在处理后立即确认消息或使用其他确认方法。
我建议你读这篇文章https://medium.com/@felipedutratine/kafka-订购-保修-99320db8f87f

相关问题