我有一个Kafka制作人,它以高速率制作消息(消息键是让我们说一个用户名,值是他在游戏中的当前分数)。 Kafka消费者在处理消费消息方面相对较慢。在这里,我的要求是显示最新的分数并避免显示过时的数据,并且可能永远不会显示某些分数。
基本上对于每个用户名,我可能在同一个分区中有数百条消息,但我总是想要阅读最新的消息。
已经实现的原始解决方案是这样的:生产者只发送一个密钥,因为每条消息和实际值都写入数据库,该数据库与消费者共享。使用者从队列中读取每个键,并从数据库中读取值。在这里,总是读取最新值的目标是通过生产者覆盖数据库中的值来实现的 - 因此实际上读取给定键的消费者实际上将消耗最新值。但是由于大量的读取和更新(缓慢,竞争条件等),这种解决方案有一些缺点。
我正在寻找一种在kafka或kafka流中解决此问题的更自然的方法,在那里我可以以某种方式定义从每个键的数据流中获取密钥的最新值。谢谢!
答案 0 :(得分:-1)
以下代码帮助
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.buffering
和commit.interval.ms