Kafka制作人-如何在不停机的情况下更改主题并保留消息顺序?

问题描述 投票:2回答:1

此问题与架构和kafka主题的迁移有关。

原始问题:没有向后兼容性的架构演变。

https://docs.confluent.io/current/schema-registry/avro.html

我正在要求社区给我一个建议或分享文章,从中我可以得到启发,甚至可以考虑解决我的问题。也许有架构或流模式。不必给我一种针对特定语言的解决方案;只是给我一个方向,我可以去...我的问题很大,对于以后想要的人来说可能很有趣

  • a)更改消息格式并将消息生成新主题。
  • b)停止将消息生成一个主题,而立即“开始”生成消息。换句话说,一旦生成了v2中的消息,就不会在v1中附加新消息。

问题

我正在更改消息格式,该格式与以前的版本不兼容。为了不打断现有的消费者,我决定对新话题发表意见。

Upcaster想法

我已经读过一个上流节目。

https://docs.axoniq.io/reference-guide/operations-guide/production-considerations/versioning-events

正式任务

v1v2为主题。目前,我在主题format_v1中生成v1格式的消息。我想将format_v2格式的消息生成到主题v2中。切换应该在我可以选择的某个时间进行。

换句话说,生产者的所有实例都将停止向v1发送消息,并开始向v2发送消息;因此,m1中的最后一条消息v1m2中的第一条消息v2之前产生。

详细信息

[我有一个主意,我可以为主题v1生成消息,其中有一个kafka Steam上播程序,该广播程序已订阅v1,并将转换后的消息推送到v2。假设转换器(在我的情况下,当然>>)能够将format_v1的消息正确地转换为format_v2

如上面有关平均模式演化的链接中所述,在我添加了一个向上转换程序并将消息生成到v1时,我已将所有v1的使用者都更改为v2

现在,棘手的部分。我们有两个要求:

1。

没有生产中断时间。

2。保留消息顺序。

它的意思是:

1)我们不允许丢失消息;客户可以随时使用我们的系统,因此我们的系统应该随时产生消息。

2)我们正在运行生产者的多个实例。在某个时刻,可能(可能)有生产者可能将格式为format_v1的消息生成为主题v1,有些实例则是将格式为format_v2的消息生成为主题v2

据我们所知,kafka不保证不同分区和主题的消息顺序。

我可以通过使用与v1相同的分区选择器将消息写入v2来解决分区问题。或者现在,我可以想象我们只对v1使用一个分区,对v2使用一个分区。


我的简化和尝试

1]我以为,当我想更改生产者以将消息产生为新主题时,我有一个上播程序(kafka流组件),能够将消息从v1转换为v2,而无需错误。这个kafka流组件是可伸缩的。

2)我所有的使用者都已经切换到v2主题。他们不断收到来自v2的消息。此时,我的生产者实例正在将消息生成到主题v1中,并且向上广播者很好地完成了工作。

3)为简化问题,让我们假设现在format_v1format_v2无关紧要,它们是相同的。

4)假设我们有一个v1分区和一个v2分区。

现在是我的问题,如何从给定的时间点立即转换所有生产者;所有实例都将消息发送到主题v2。

我的同事和kafka专家告诉我,可以在停机时间完成

如果您依赖分区中消息的顺序,则不能在没有停机的情况下切换到新版本。为了使停机时间最少,我们可以执行以下操作。

Upcaster组件必须将数据写入相同的分区,并应尝试进行相同的偏移。但是,并非总是可能的,因为偏移量可能有间隙,因此必须保留旧偏移量和新偏移量之间的映射。没有所有记录,只有每个分区的最后一个批量。如果upcaster崩溃,请重新开始,生产者仍不参与v2。

启动v2使用者。如果它从与v1相同的使用者组开始,则不应执行任何操作,如果它具有新的使用者组,请根据新偏移量更新Kafka中的偏移量。

现在生产者写入v1,向上转换者转换数据,消费者从v2消费

这里是休息时间。当upcaster的滞后时间接近于0时,关闭v1生产者,等到upcaster转换其余记录,关闭upcaster,启动v2生产者,该生产者写入v2主题。

尽管我是通过数据库中的手动操作(通过某些端点或其他方式)来更改标志;生产者在生成消息之前总是检查标志。当标志显示v2true时,生产者将开始将消息写入v2。但是,如果在某个时间该标志为假,那么一个生产者开始将消息生成到v1中,然后该标志发生了变化,而另一个生产者在先前的生产者完成生产到v2中之前又将消息发送到了v1中,该怎么办。

此问题与架构和kafka主题的迁移有关。原始问题:没有向后兼容性的架构演化。 https://docs.confluent.io/current/schema-registry/avro.html我是...

avro messaging kafka-producer-api
1个回答
1
投票

您只有一个生产者处于活动状态是否可以接受?

在这种情况下,您可以将您的想法与标志一起使用:

© www.soinside.com 2019 - 2024. All rights reserved.