Yesterday's stream of changes has to become answers. The first architecture that worked ran two paths at once.
Lambda sends every event down both. A batch layer reprocesses everything nightly and produces the authoritative answer. A streaming layer produces an approximate one within seconds. A serving layer merges the two and hands back whatever is ready.
It works, and the cost is that the same business logic now lives in two codebases, in two frameworks, with two chances to diverge. Every bug fix has to be written twice and produce identical results.
Kappa deletes one of the paths. There is only the stream, and reprocessing means replaying the log from offset zero with new code. One codebase, one definition of every metric, and a reprocessing story that is the normal path run again.
What it costs is retention. The log has to reach back far enough to rebuild from, which in practice means an object storage archive sitting behind it.
Running two systems to get two properties is often a sign the first one wasn't asked to do enough.
