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))