首页 > 解决方案 > 使用 KAFKA 和非事务性数据库进行自动缩放

问题描述

比如说,我有一个从 KAFKA 读取一批数据的应用程序,它使用传入消息的键并对 HBase 进行查询(从 HBase 中读取这些键的当前数据),进行一些计算并将数据写回 HBase对于同一组键。例如

{K1, V1}, {K2, V2}, {K3, V3}(来自 KAFKA 的传入消息)--> My Application(从 HBase 读取 K1、K2 和 K3 的当前值,使用传入的值 V1、V2 和V3 进行一些计算,并在处理完成后将 K1 (V1+x)、K2 (V2+y) 和 K3(V3+z) 的新值写回 HBase。

现在,假设我有一个 KAFKA 主题分区和 1 个消费者。我的应用程序有一个正在处理数据的消费者线程。

问题是说 HBase 出现故障,此时我的应用程序停止处理消息,并且在 KAFKA 中建立了巨大的延迟。即使我有能力增加分区数量和相应的消费者,但由于 HBase 中的 RACE 条件,我无法增加其中任何一个。HBase 不支持行级锁定,所以现在如果我增加分区的数量,相同的键可能会转到两个不同的分区,并相应地转到两个不同的消费者,他们可能最终处于 RACE 状态,最后写入的人就是赢家。我必须等到所有消息都得到处理后才能增加分区数。

例如

HBase 出现故障 --> 最初我有一个主题分区,并且有未处理的消息 --> 分区 0 中的 {K3, V3} --> 现在我增加了分区的数量,并且现在存在带有键 K3 的消息让我们说在分区 0 和 1 中 --> 然后从分区 0 消费的消费者和从分区 1 消费的另一个消费者最终将竞争写入 HBase。

有解决问题的方法吗?当然,由处理消息的消费者锁定密钥 K3 不是解决方案,因为我们正在处理大数据。

标签: apache-kafkakafka-consumer-api

解决方案


当您增加分区数量时,只有新消息会到达新添加的分区。Kafka 负责只处理一条消息一次


推荐阅读