1090. Windowing - dkkahm/study-kafka-with-spring GitHub Wiki
์ข
๋ฅ
- Tumbling Time Window
- ์ค์ ๋ Tumbling ์๊ฐ ๋จ์๋ก ์ง๋ฅด๊ณ , ์ด์ ์๊ฐ ๋จ์๊ฐ ๋๋๋ฉด ๋ฐ๋ก ์ด์ด์ ๋ค์ ์๊ฐ ๋จ์ ์์
- Hopping Time Window
- ์ค์ ๋ Tumbling ์๊ฐ ๋จ์๋ก ์ง๋ฅด๊ณ , Hopping ์๊ฐ ๋จ์๋ก Sliding(Hoping)
- ...
Tumbling Time Window
- Windowed Serde for Key
- groupBy()
- windowBy()
- Topic์ผ๋ก ๋ณด๋ด๋ ค๋ฉด
- toStream()
- Produced.with KeySerde์ windowSerde ์ฌ์ฉ
- Prined ์ฌ์ฉํ๋ ค๋ฉด,
- toStream()
- print(Printed.toSysout())
@Bean
public KStream<String, InventoryMessage> kstreamInventory(StreamsBuilder builder) {
var stringSerde = Serdes.String();
var inventorySerde = new JsonSerde<>(InventoryMessage.class);
var longSerde = Serdes.Long();
var windowLength = Duration.ofMinutes(1);
var windowSerde = WindowedSerdes.timeWindowedSerdeFrom(String.class, windowLength.toMillis());
var inventoryTimestampExtractor = new InventoryTimestampExtractor();
var inventoryStream = builder.stream("t.commodity.inventory",
Consumed.with(stringSerde, inventorySerde, inventoryTimestampExtractor, null));
inventoryStream.print(Printed.<String, InventoryMessage>toSysOut().withLabel("Inventory"));
var inventoryTotalStream = inventoryStream
.mapValues((k, v) -> v.getType().equalsIgnoreCase("ADD") ? v.getQuantity() : -1 * v.getQuantity())
.groupByKey()
.windowedBy(TimeWindows.of(windowLength))
.reduce(Long::sum, Materialized.with(stringSerde, longSerde))
.toStream();
inventoryTotalStream.through("t.commodity.inventory-total", Produced.with(windowSerde, longSerde))
.print(Printed.toSysOut());
return inventoryStream;
}
Hopping Time Window
- TimeWindow.of().advancedBy(hopLength)
var windowLength = Duration.ofMinutes(1);
var hopLength = Duration.ofSeconds(20);
var windowSerde = WindowedSerdes.timeWindowedSerdeFrom(String.class, windowLength.toMillis());
.groupByKey()
.windowedBy(TimeWindows.of(windowLength).advanceBy(hopLength))
.reduce(Long::sum, Materialized.with(stringSerde, longSerde))