Event-Driven Analytics: Building Real-Time Dashboards with Apache Flink and Ktor

A presentation at KotlinConf 2025 in May 2025 in Copenhagen, Denmark by Viktor Gamov

Slide 1

Slide 1

 Event-Driven Analytics Building Real-Time Dashboards with Apache Flink and Ktor Viktor Gamov Principal Developer Advocate @ Confluent X/Bluesky: @gamussa 1

Slide 2

Slide 2

X/Bluesky: X/Bluesky: @gamussa @gamussa

Slide 3

Slide 3

X/Bluesky: X/Bluesky: @gamussa @gamussa

Slide 4

Slide 4

X/Bluesky: @gamussa

Slide 5

Slide 5

X/Bluesky: @gamussa

Slide 6

Slide 6

Viktor GAMOV Principal Developer Advocate | Con luent Java Champion Co-Author «Ka ka in Action» X/Bluesky: @gamussa f f f THE CLOUD CONNECTIVITY COMPANY Kong Con idential

Slide 7

Slide 7

Slides and Video https://speaking.gamov.io/ X/Bluesky: @gamussa

Slide 8

Slide 8

X/Bluesky: @gamussa

Slide 9

Slide 9

X/Bluesky: @gamussa

Slide 10

Slide 10

What is Stream Processing? X/Bluesky: @gamussa

Slide 11

Slide 11

What is Stream Processing? Stream Processing is the toolset for dealing with events as they move! X/Bluesky: @gamussa

Slide 12

Slide 12

Stateless or Stateful? X/Bluesky: @gamussa

Slide 13

Slide 13

X/Bluesky: @gamussa

Slide 14

Slide 14

X/Bluesky: @gamussa

Slide 15

Slide 15

What is Apache Flink?

Slide 16

Slide 16

What is Flink? Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. X/Bluesky: @gamussa

Slide 17

Slide 17

Streaming ● A stream is a sequence of events ● Business data is always a stream: bounded or unbounded ● For Flink, batch processing is just a special case in the runtime X/Bluesky: @gamussa

Slide 18

Slide 18

📂 Use cases for Flink Data pipelines & ETL Stream & batch analytics Event-driven applications Real-time data pipelines that continuously ingest, enrich, and transform data streams, loading them into destination systems for timely action. Extract insights from raw data via traditional batch queries or continuously via streaming queries. Recognize patterns and react to incoming events by triggering computations, state updates, or external actions. Example: streaming/batch aggregation Example: fraud detection Example: data routing X/Bluesky: @gamussa

Slide 19

Slide 19

X/Bluesky: @gamussa

Slide 20

Slide 20

The JobGraph (or topology) X/Bluesky: @gamussa

Slide 21

Slide 21

The JobGraph (or topology) CONNECTION OPERATOR X/Bluesky: @gamussa

Slide 22

Slide 22

Stream processing • Parallel • Forward • Repartition SOURCE grouped by shape • Rebalance X/Bluesky: @gamussa

Slide 23

Slide 23

Stream processing • Parallel • Forward • Repartition SOURCE grouped by shape • Rebalance X/Bluesky: @gamussa

Slide 24

Slide 24

Stream processing • Parallel • Forward • Repartition FILTER group by color • Rebalance X/Bluesky: @gamussa

Slide 25

Slide 25

Stream processing 4 3 2 1 • Parallel • Forward COUNT • Repartition 1 • Rebalance 3 X/Bluesky: @gamussa 2

Slide 26

Slide 26

Stream processing with SQL events INSERT INTO results SELECT color, COUNT(*) FROM events WHERE color orange GROUP BY color; COUNT results GROUP BY color WHERE color <> orange

< X/Bluesky: @gamussa

Slide 27

Slide 27

Stream processing with SQL events INSERT INTO results SELECT color, COUNT(*) FROM events WHERE color orange GROUP BY color; COUNT results GROUP BY color WHERE color <> orange

< X/Bluesky: @gamussa

Slide 28

Slide 28

Stream processing with SQL events INSERT INTO results SELECT color, COUNT(*) FROM events WHERE color orange GROUP BY color; COUNT results GROUP BY color WHERE color <> orange

< X/Bluesky: @gamussa

Slide 29

Slide 29

Stream processing with SQL events INSERT INTO results SELECT color, COUNT(*) FROM events WHERE color orange GROUP BY color; COUNT results GROUP BY color WHERE color <> orange

< X/Bluesky: @gamussa

Slide 30

Slide 30

Stream processing with SQL events COUNT results INSERT INTO results SELECT color, COUNT(*) FROM events WHERE color orange GROUP BY color; GROUP BY color events WHERE color <> orange

< X/Bluesky: @gamussa

Slide 31

Slide 31

Flink’s APIs SQL API Table API Optimizer / Planner DataStream API Low-Level Stream Operator API Apache Flink Runtime X/Bluesky: @gamussa

Slide 32

Slide 32

Flink’s APIs: mix & match Easy to use / declarative Flink SQL ● ● ● ● Level of abstraction Table API ● DataStream API Process Functions ● ● ● ● Code Generation Efficient data types Cost-based optimizer Highly efficient operator implementations (joins, aggregations, deduplications, …) → Easy to write efficient code with low effort Ready-made operators for Windowing: sliding, tumbling, session. Late event handling. CEP / Async IO operators Sources / Sinks / Flink Connectors Custom data types Raw, low level access to state, time → A lot of potential to make mistakes :) Low level / expressive X/Bluesky: @gamussa

Slide 33

Slide 33

State Management

Slide 34

Slide 34

Stateful stream processing with Flink SQL events INSERT INTO results SELECT color, COUNT(*) FROM events WHERE color orange GROUP BY color; COUNT results GROUP BY color WHERE color <> orange

< X/Bluesky: @gamussa

Slide 35

Slide 35

Stateful stream processing with Flink SQL events INSERT INTO results SELECT color, COUNT(*) FROM events WHERE color orange GROUP BY color; ● Filtering is stateless COUNT results GROUP BY color WHERE color <> orange

< X/Bluesky: @gamussa

Slide 36

Slide 36

Stateful stream processing with FlinkSQL events COUNT results ● Counting requires state GROUP BY color WHERE color <> orange X/Bluesky: @gamussa

Slide 37

Slide 37

State Stored on the heap or on disk using RocksDB (a KV store) • Local • Fast • Fault tolerant Distributed, reliable storage such as S3 or HDFS X/Bluesky: @gamussa

Slide 38

Slide 38

Summary Streaming State Event time and watermarks State snapshots for recovery A sequence of events. Delightfully simple ● local ● key/value ● single-threaded Watermarks indicate how much progress the time in the stream has made. Transparent to application developers, enables correctness and operations. Unfamiliar to many developers, but ultimately straightforward. X/Bluesky: @gamussa

Slide 39

Slide 39

Demo Time?! X/Bluesky: @gamussa

Slide 40

Slide 40

As Always Have a Nice Day X/Bluesky: @gamussa Github: @gamussa LinkedIn: vikgamov https://gamov.dev/rel http://gamov.dev/YouTube X and Bluesky: @gamussa