Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在内存中的Kafka Streams状态存储上启用缓存_Java_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Java 如何在内存中的Kafka Streams状态存储上启用缓存

Java 如何在内存中的Kafka Streams状态存储上启用缓存,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我想减少向下游发送的数据数量,因为我只关心给定键的最后一个值,所以我通过以下方式读取主题中的数据: KTable table = build.table("inputTopic", Materialized.as("myStore")); 为什么??因为在引擎盖下,数据正在被缓存(如上所述),并且只有在commit.interval.ms或cache.max.bytes.buffering启动时才被转发 到目前为止还不错,但因为在本例中我根本没有利用RocksDB,所以我想用内存存储的默认实现

我想减少向下游发送的数据数量,因为我只关心给定键的最后一个值,所以我通过以下方式读取主题中的数据:

KTable table = build.table("inputTopic", Materialized.as("myStore"));
为什么??因为在引擎盖下,数据正在被缓存(如上所述),并且只有在commit.interval.ms或cache.max.bytes.buffering启动时才被转发

到目前为止还不错,但因为在本例中我根本没有利用RocksDB,所以我想用内存存储的默认实现来替换它。我隐式启用缓存,以防万一

Materialized.as(Stores.inMemoryKeyValueStore("myStore")).withCachingEnabled();
但是,它不起作用——数据没有被缓存,每个记录都被发送到下游


是否有其他方法可以启用缓存?或者也许有更好的方法来实现我想要实现的目标?

看来我错了,内存状态存储缓存工作正常。我将简要说明我是如何测试它的,也许有人会发现它很有用。我制作了一个非常基本的Kafka Streams应用程序,它只读取抽象为KTable的主题

public class Main {
    public static void main(String[] args) {
        StreamsBuilder builder = new StreamsBuilder();
        Logger logger = LoggerFactory.getLogger(Main.class);

        builder.table("inputTopic", Materialized.as(Stores.inMemoryKeyValueStore("myStore")).withCachingEnabled())
                .toStream()
                .foreach((k, v) -> logger.info("Result: {} - {}", k, v));

        new KafkaStreams(builder.build(), getProperties()).start();
    }

    private static Properties getProperties() {
        Properties properties = new Properties();
        properties.put(APPLICATION_ID_CONFIG, "testApp");
        properties.put(BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        properties.put(COMMIT_INTERVAL_MS_CONFIG, 10000);
        properties.put(CACHE_MAX_BYTES_BUFFERING_CONFIG, 10 * 1024 * 1024L);
        properties.put(DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
        properties.put(DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
        return properties;
    }
}
然后我运行了Kafka的控制台制作程序:

/kafka-console-producer.sh --broker-list localhost:9092 --topic inputTopic --property "parse.key=true" --property "key.separator=:"
并发送了几条信息:a:a,a:b,a:c。只有最后一条消息在应用程序中可见,因此缓存按预期工作

2018-03-06 21:21:57主要信息:26-结果:a-c

我还稍微更改了流,以检查
aggregate
方法的缓存

builder.stream("inputTopic")
        .groupByKey()
        .aggregate(() -> "", (k, v, a) -> a + v, Materialized.as(Stores.inMemoryKeyValueStore("aggregate")))
        .toStream()
        .foreach((k, v) -> logger.info("Result: {} - {}", k, v));

我已经用同一个密钥连续快速发送了几条消息,并且只收到了一个结果,因此数据没有立即发送到下游-与预期的完全一致。

这应该可以像您预期的那样工作。。。不知道为什么不适合你。再次检查:您没有将
缓存.max.bytes.buffering
设置为零?要进一步调试此功能,能否在
KTableSourceProcessor#init
(KTableSource中的嵌套类)中设置断点,并检查所用键值存储的类/类型?它应该是一个
CachingKeyValue
store.@MatthiasJ.Sax cache.max.bytes.buffering设置为100MB。我编写了MCVE,它测试从一个主题到一个KTable和一个聚合操作的读取,这两个操作都使用内存缓存存储。。。而且它们确实像预期的那样工作:)这一定是我犯了一些愚蠢的错误。你认为我应该删除我的问题还是用MCVE来回答它,这表明我错了?很高兴它能工作,而且它不是一个bug:)--我猜你是否想删除这个问题取决于你。