如何在实时系统中更改分区程序逻辑

时间:2019-06-06 13:10:39

标签: apache-kafka kafka-consumer-api kafka-producer-api

在Kafka部署中,自定义主题分区器逻辑用于将属于同一根实体的所有消息(例如,特定用户的所有消息)路由到同一分区。

有人能推荐一种策略来解决这种实时系统中的分区逻辑更改吗?

影响分区的一个示例是分区器实现的明显变化。另一个示例是更改给定主题的分区数。

在这两种情况下,我们最终都会遇到这样的情况:在更改逻辑或分区消息更改数量之后,在更改之前进入Kafka的用户A的某些消息将位于分区1中。同一用户A将进入分区2。

这可能会导致用户A的邮件处理不正确的问题。从分区2读取消息的使用者可以在从分区1读取消息的使用者之前处理消息。

有人在实时系统中遇到过此问题吗?您或您将如何解决此问题?

这似乎是一个非常普遍的情况,但是我找不到任何东西。

谢谢

2 个答案:

答案 0 :(得分:1)

通过分区逻辑,如果您指的是分区算法,我不知道这种变化将如何变化。至于增加分区,理论上不可能在保证消息顺序的同时增加分区。 -有一个KIP,但其状态仍在“讨论中”。

当我增加分区时,我通常要做的是减少停机时间。

剧本是这样的:

  1. 停止生产者

  2. 监视消费者组的滞后时间

  3. 一旦滞后为零,关闭消费者

  4. 增加分区数

  5. 启动消费者

  6. 开始制作人

这样,您可以确保没有消息丢失,也不会浪费消息。

如果要避免停机,您可能必须依靠一个外部系统,该系统可以按顺序临时存储每个分区的数据并进行发布,但是该解决方案取决于几件事

答案 1 :(得分:0)

更改记录分区方式的最佳方法是使用默认的ApacheKafka®分区器,并更改记录键。如果来自用户的所有记录都需要转到同一主题,请确保它们都具有相同的键。

如果要更改整个集合的键,则可以使用PARTITION BY函数,使用KSQL来对数据重新键(使用新键重新发布到新主题)。