为每个键使用来自主题的最新值

icnyk63a  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(286)

我有一个Kafka生产者,这是生产高速率的消息(消息键是让我们说一个用户名和价值是他在游戏中的当前得分)。Kafka消费者在处理消费的消息方面相对较慢。在这里,我的要求是显示最新的分数,并避免显示过时的数据,但有些分数可能永远不会显示。
基本上,对于每个用户名,我可能在同一分区中有数百条消息,但我总是想读最新的一条。
已经实现的一个粗略的解决方案是这样的:当每条消息和实际值被写入数据库时,生产者只发送一个键,然后与使用者共享。使用者从队列中读取每个键,并从数据库中读取值。在这里,始终读取最新值的目标是通过生产者覆盖数据库中的值来实现的——因此,实际上正在读取给定键的使用者将实际使用最新值。但是这个解决方案有一些缺点,因为读取和更新的次数太多(速度慢,竞争条件等)
我正在寻找一种更自然的方法来解决这个问题,在kafka或kafka流中,我可以从每个键的数据流中定义get-latest值。谢谢!

aij0ehis

aij0ehis1#

下面的代码有帮助

KStreamBuilder builder = new KStreamBuilder();
KTable<String, String> dataTable = builder.table("input-topic");
dataTable.toStream().foreach((key, message) -> client.post(message));
KafkaStreams streams = new KafkaStreams(builder, config);
streams.start();

在实践中实现这一点的原因是传入流的内存压缩(这里详细解释)。我们可以用这些参数来控制压力 cache.max.bytes.buffering 以及 commit.interval.ms

相关问题