在Kafka部署中,自定义主题分区器逻辑用于将属于同一根实体的所有消息(例如,特定用户的所有消息)路由到同一分区。
有人能推荐一种策略来解决这种实时系统中的分区逻辑更改吗?
影响分区的一个示例是分区器实现的明显变化。另一个示例是更改给定主题的分区数。
在这两种情况下,我们最终都会遇到这样的情况:在更改逻辑或分区消息更改数量之后,在更改之前进入Kafka的用户A的某些消息将位于分区1中。同一用户A将进入分区2。
这可能会导致用户A的邮件处理不正确的问题。从分区2读取消息的使用者可以在从分区1读取消息的使用者之前处理消息。
有人在实时系统中遇到过此问题吗?您或您将如何解决此问题?
这似乎是一个非常普遍的情况,但是我找不到任何东西。
谢谢
答案 0 :(得分:1)
通过分区逻辑,如果您指的是分区算法,我不知道这种变化将如何变化。至于增加分区,理论上不可能在保证消息顺序的同时增加分区。 -有一个KIP,但其状态仍在“讨论中”。
当我增加分区时,我通常要做的是减少停机时间。
剧本是这样的:
停止生产者
监视消费者组的滞后时间
一旦滞后为零,关闭消费者
增加分区数
启动消费者
开始制作人
这样,您可以确保没有消息丢失,也不会浪费消息。
如果要避免停机,您可能必须依靠一个外部系统,该系统可以按顺序临时存储每个分区的数据并进行发布,但是该解决方案取决于几件事
答案 1 :(得分:0)
更改记录分区方式的最佳方法是使用默认的ApacheKafka®分区器,并更改记录键。如果来自用户的所有记录都需要转到同一主题,请确保它们都具有相同的键。
如果要更改整个集合的键,则可以使用PARTITION BY
函数,使用KSQL来对数据重新键(使用新键重新发布到新主题)。