我们有一个只有一个分区的压缩主题,我们向它添加了一个新分区。我们没有对现有数据进行重新分区——这意味着在添加新分区之前加载的事件仍在分区中0。正如预期的那样,新事件根据标准策略存储:具有相同键的所有事件都存储在同一分区中。我们目前遇到这样的情况:Partition Offset Timestamp Key Value0 586 1545388284240 COD_ISIN AAA1 983 1551800369978 COD_ISIN BBB1 1141 1556526044144 COD_ISIN CCC当我在 a 中加载此主题时GlobalKTable,商店中的值为AAA。我们显然希望拥有CCC当前价值。GlobalKTable<String, JsonNode> storeDatacatalog = builder.globalTable(TOPIC, consumed, Materialized.as(STORE_DATACATALOG));KStream<String, JsonNode> inEvent = builder.stream(OTHER_TOPIC, consumed);inEvent = inEvent.transform( new TransformerSupplier<String, JsonNode, KeyValue<String, JsonNode>>() { @Override public Transformer<String, JsonNode, KeyValue<String, JsonNode>> get() { return new Transformer<String, JsonNode, KeyValue<String, JsonNode>>() { private ProcessorContext context; private KeyValueStore<String, JsonNode> dataCatalogueState; @Override public void init(ProcessorContext context) { this.context = context; this.dataCatalogueState = (KeyValueStore<String, JsonNode>) context.getStateStore(STORE_DATACATALOG); LOGGER.debug("Content of dataCatalogueState: "); KeyValueIterator<String, JsonNode> allDc = this.dataCatalogueState.all(); JsonNode valueForIsin = null; }; } })如何GlobalKTable建立它的状态?它是基于Offset还是基于Timestamp? 它是否在内部将密钥粘贴到找到密钥的第一个分区?我知道如何解决(清除主题并再次填充 - 将应用分区策略)。但我很好奇它在内部是如何工作的。
1 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
GlobalKTable
假设数据按键分区。因此,如果您在不同分区中有具有相同键的记录,则无法保证将应用哪个订单记录。仅保证每个分区的顺序。除此之外,atm,更新仅基于分区内的偏移量。
使用上面的示例,订单可以是
AAA、BBB、CCC
BBB、AAA、CCC
BBB、CCC、AAA
只能保证,BBB 将在 CCC 之前应用。
添加回答
举报
0/150
提交
取消