此问题与架构和kafka主题的迁移有关。
原始问题:没有向后兼容性的架构演变。
https://docs.confluent.io/current/schema-registry/avro.html
我正在要求社区给我一个建议或分享文章,从中我可以得到启发,甚至可以考虑解决我的问题。也许有架构或流模式。不必给我一种针对特定语言的解决方案;只是给我一个方向,我可以去...我的问题很大,对于以后想要的人来说可能很有趣
v2
中的消息,就不会在v1
中附加新消息。我正在更改消息格式,该格式与以前的版本不兼容。为了不打断现有的消费者,我决定对新话题发表意见。
我已经读过一个上流节目。
https://docs.axoniq.io/reference-guide/operations-guide/production-considerations/versioning-events
让v1
和v2
为主题。目前,我在主题format_v1
中生成v1
格式的消息。我想将format_v2
格式的消息生成到主题v2
中。切换应该在我可以选择的某个时间进行。
换句话说,生产者的所有实例都将停止向v1
发送消息,并开始向v2
发送消息;因此,m1
中的最后一条消息v1
在m2
中的第一条消息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_v1
和format_v2
无关紧要,它们是相同的。
4)假设我们有一个v1
分区和一个v2
分区。
现在是我的问题,如何从给定的时间点立即转换所有生产者;所有实例都将消息发送到主题v2。
我的同事和kafka专家告诉我,可以在停机时间完成
如果您依赖分区中消息的顺序,则不能在没有停机的情况下切换到新版本。为了使停机时间最少,我们可以执行以下操作。
Upcaster组件必须将数据写入相同的分区,并应尝试进行相同的偏移。但是,并非总是可能的,因为偏移量可能有间隙,因此必须保留旧偏移量和新偏移量之间的映射。没有所有记录,只有每个分区的最后一个批量。如果upcaster崩溃,请重新开始,生产者仍不参与v2。
启动v2使用者。如果它从与v1相同的使用者组开始,则不应执行任何操作,如果它具有新的使用者组,请根据新偏移量更新Kafka中的偏移量。
现在生产者写入v1,向上转换者转换数据,消费者从v2消费
这里是休息时间。当upcaster的滞后时间接近于0时,关闭v1生产者,等到upcaster转换其余记录,关闭upcaster,启动v2生产者,该生产者写入v2主题。
尽管我是通过数据库中的手动操作(通过某些端点或其他方式)来更改标志;生产者在生成消息之前总是检查标志。当标志显示
v2
或true
时,生产者将开始将消息写入v2
。但是,如果在某个时间该标志为假,那么一个生产者开始将消息生成到v1
中,然后该标志发生了变化,而另一个生产者在先前的生产者完成生产到v2
中之前又将消息发送到了v1
中,该怎么办。
此问题与架构和kafka主题的迁移有关。原始问题:没有向后兼容性的架构演化。 https://docs.confluent.io/current/schema-registry/avro.html我是...
您只有一个生产者处于活动状态是否可以接受?
在这种情况下,您可以将您的想法与标志一起使用: