我试图将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)。因此,实例必须: