从主题中为每个键消耗最新值

Consume latest value from a topic for each keys

我有一个以高速率生成消息的 Kafka 生产者(消息键是用户名,值是他在游戏中的当前分数)。 Kafka消费者处理消费消息的速度比较慢。在这里,我的要求是显示最新的分数并避免显示过时的数据,代价是某些分数可能永远不会显示。

基本上对于每个用户名,我可能在同一个分区中有数百条消息,但我总是想阅读最新的一条。

一个粗略的解决方案是这样的:生产者只发送一个键作为每条消息,实际值被写入数据库,与消费者共享。消费者从队列中读取每个键并从数据库中读取值。在这里,始终读取最新值的目标是通过生产者覆盖数据库中的值来实现的——因此实际上正在读取给定键的消费者实际上将消费最新值。但是由于大量的读取和更新(速度慢、竞争条件等),这个解决方案有一些缺点

我正在寻找一种更自然的方法来在 kafka 或 kafka 流中解决这个问题,我可以在其中以某种方式定义 从每个键的数据流中获取键的最新值 .谢谢!

以下代码有帮助

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();

在实践中使这成为可能的是传入流的内存压缩(详细信息解释 here)。我们可以使用参数 cache.max.bytes.bufferingcommit.interval.ms

来控制压力