无法检索Kafka Streams中的状态存储键的元数据

时间:2017-12-08 11:05:01

标签: apache-kafka apache-kafka-streams

我试图将Kafka Streams与分布在两个实例中的状态存储区一起使用。以下是如何定义商店和相关的KTable:

KTable<String, Double> userBalancesTable = kStreamBuilder.table(
        "balances-table",
        Consumed.with(String(), Double()),
        Materialized.<String, Double, KeyValueStore<Bytes, byte[]>>as(BALANCES_STORE).withKeySerde(String()).withValueSerde(Double())
);

接下来,我有一些流处理逻辑,它将一些数据聚合到此balance-table KTable:

transactionsStream
        .leftJoin(...)
        ...
        .aggregate(...)
        .to("balances-table", Produced.with(String(), Double()));

在某些时候,我从REST处理程序中查询状态存储。

ReadOnlyKeyValueStore<String, Double> balances = streams.store(BALANCES_STORE, QueryableStoreTypes.<String, Double>keyValueStore());
return Optional.ofNullable(balances.get(userId)).orElse(0.0);

完美无缺 - 只要我有一个流处理实例。

现在,我正在添加第二个实例(注意:我的主题都有2个分区)。如the docs中所述,状态存储BALANCES_STORE基于每个记录的密钥分布在实例中(在我的示例中,密钥是用户ID)。因此,实例必须:

  1. 调用KafkaStreams#metadataForKey以发现哪个实例正在处理包含要检索的密钥的状态存储部分

  2. 对此实例进行RPC(例如REST)调用以检索它

  3. 我的问题是对KafkaStreams#metadataForKey的调用始终返回空元数据对象。但是,KafkaStreams#allMetadataForStore()正在返回包含这两个实例的元数据对象。所以它的行为就像它不知道我查询的关键,虽然在州商店的工作中查找它。

    Debug

    附加说明:我的application.server属性已正确设置。

    谢谢!

0 个答案:

没有答案