You Gotta Push If You Wanna Pull
Explores the limitations of traditional pull queries in data systems and advocates for using materialized views and data duplication to improve performance.
Morling.dev is the personal blog of Michael Morling, a software engineer and architect with deep expertise in Java, Spring, JVM internals, architecture, performance, and developer tooling. His writing focuses on practical and detailed explanations of topics such as Spring framework internals, microservices design, JVM garbage collection, performance tuning, clean architecture, Gradle builds, and language features that matter in real projects. Michael often breaks down subtle behaviors of the JVM and Spring ecosystem, helping developers understand why things work the way they do and how to improve reliability and efficiency in production systems.
91 articles from this blog
Explores the limitations of traditional pull queries in data systems and advocates for using materialized views and data duplication to improve performance.
Explains idempotency keys in distributed systems, comparing UUIDs and monotonic sequences for duplicate detection and exactly-once processing.
Explores building a basic Durable Execution engine using SQLite and Java to reliably persist and resume multi-step workflows, like those in agentic systems.
Argues against the common advice to replace Kafka with Postgres, explaining they are different tools for different problems.
Explores how Java's ZGC garbage collector reduces tail latencies in microservices compared to the default G1 collector, using practical benchmarks.
Explains the difference between restart_lsn and confirmed_flush_lsn in PostgreSQL replication slots for troubleshooting and optimization.
Explores using Java 21+ virtual threads to elegantly convert legacy Future objects into modern, composable CompletableFuture instances.
Best practices for managing PostgreSQL replication slots to prevent WAL bloat and ensure reliable CDC pipelines in production.
Explores building AI Agents as streaming SQL queries using platforms like Apache Flink for improved consistency, scalability, and developer experience.
Explains challenges with Postgres TOAST columns in Debezium CDC events and solutions using Debezium's reselect processor and Apache Flink.
Argues that 'Stream vs. Batch' is a misleading dichotomy; the real distinction is between 'Push vs. Pull' semantics in data processing.
Explores reimagining Apache Kafka for the cloud, proposing a diskless, partition-free design with key-centric streams and topic hierarchies.
A technical guide exploring different Flink SQL connectors and formats for ingesting and processing Debezium CDC events from Apache Kafka topics.
A guide to building a native Apache Kafka binary on macOS using GraalVM for faster startup times, based on the official KIP-974 configuration.
Explores JEP 483: Ahead-of-Time Class Loading & Linking in Java 24, part of Project Leyden, aimed at reducing application startup times.
Explains the concept of a 'synchrony budget' for designing distributed systems, advocating for asynchronous communication to improve performance and availability.
Explores KIP-932, a proposal to add queue semantics and share groups to Apache Kafka for improved message processing.
Part 2 of a guide on running Apache Flink on Kubernetes, covering fault tolerance, high availability, savepoints, and observability.
A technical guide on installing Apache Flink's Kubernetes operator and deploying your first Flink job, part 1 of a 2-part series.
Explains how Postgres 17 introduces built-in failover replication slots, improving high availability for logical replication and CDC tools like Debezium.