Apache Stateful Functions is one of the quietly powerful frameworks in the Flink ecosystem - durable per-key state, exactly-once messaging, polyglot remote functions, all on top of Apache Flink. It's also been functionally dormant since October 2024 , and it doesn't run on Flink 2.x.
We needed it on Flink 2.x. So we maintained the continuation: kzmlabs/flink-statefun .
This post is the why and the how it's different . If you're already running upstream and wondering whether to migrate, or you're picking a stateful-actor framework today and trying to understand the landscape, read on.
What StateFun gives you
If you've never touched Stateful Functions, here's the elevator version. Compare a hand-written keyed Flink job:
public final class CounterFunction extends KeyedProcessFunction < String , Event , Result > {
private static final long serialVersionUID = 1L ;
private static final ValueStateDescriptor < Long > COUNT_DESCRIPTOR = new ValueStateDescriptor <>( "count" , Types .…