Skip to content
kc@kumarChandrachooda.com:~$ cd /blog/series/one-module-leaves-the-process && read --section="top" 0%
Series

One Module Leaves the Process

In reading order.

  • 12 parts
  • ≈ 81 min total
  • 12 published
Part 1 28 Jan 2026 7 min read

The Branch Where the Monolith Splits

Every modular monolith promises you can extract a module later. Inflow has a branch where someone actually did it - one module lifted into its own process behind a gateway and a real broker. This series reads that branch line by line.

Part 2 28 Jan 2026 7 min read

A Hundred and Eight Files, Not a Hundred and Sixty-One

Ask git what an extraction cost and it will confidently give you the wrong number. Inflow's microservices branch diffs at 161 files against master - the honest figure is 108, and the fifty-three-file gap is a lesson in how migration retrospectives get fabricated.

Part 3 29 Jan 2026 6 min read

The Interface That Did Not Move

Inflow's IMessageBroker is byte-identical on the monolith branch and the microservices branch, and not one handler, saga or controller changed to accommodate a real broker. That is a genuine result - and the reason it worked is also the reason for everything that goes wrong later.

Part 4 30 Jan 2026 7 min read

Two Hundred and Sixty-One Lines of Transport

The whole RabbitMQ adapter that makes Inflow's monolith talk to an extracted service is five files in one folder. Reading them shows how small a real transport swap can be - and where the fan-out quietly narrowed from every handler to exactly one.

Part 5 30 Jan 2026 6 min read

Eight Queue Names Hold the Fan-Out Together

Inflow's queue template would have given three modules one shared queue and turned publish-subscribe into competing consumers. Eight hand-written string literals in three projects are what prevent it - and forgetting a ninth would not be an error, just silence.

Part 6 31 Jan 2026 7 min read

Your Routing Key Is a Class Name

On Inflow's microservices branch the wire address of every event is derived from the CLR type name, computed independently on both sides of the network. Two records in two assemblies match only because someone spelled them the same way.

Part 7 01 Feb 2026 6 min read

The Envelope That Did Not Cross

Inflow publishes a message id onto the wire, RabbitMQ delivers it, and the subscriber never reads it. The response was a guard that skips deduplication rather than one that reads the id - and the correlation id that does cross is a fresh random Guid.

Part 8 01 Feb 2026 7 min read

Extraction by Copy and Disable

Inflow did not delete the module it extracted. It copied sixty-odd files into a new service, flipped one boolean, and left both copies in the solution - a decision that is better than it first looks and costs more than it first looks.

Part 9 02 Feb 2026 7 min read

Contract Checking Left When the Network Arrived

Inflow's monolith failed startup when two modules disagreed about the shape of a shared event. The microservices branch deletes that check from exactly the boundary that became remote - and it turns out the deletion was not optional.

Part 10 03 Feb 2026 7 min read

Four Lines From a Switch

Inflow's transport seam is one method wide and genuinely transport-agnostic, but it has exactly one implementation and no default. A four-line Null Object and one if statement would have turned a fork in the road into a configuration flag.

Part 11 03 Feb 2026 6 min read

Nobody Moved the Data

The extracted Customers service ships one EF migration that creates three empty tables in a brand-new database. Nothing dual-writes, nothing backfills, nothing reconciles - and the only path that repopulates the service is events that have not happened yet.

Part 12 04 Feb 2026 8 min read

The Seam Held, the Envelope Did Not

Eleven parts of reading one commit. Inflow's dependency-inversion boundary survived a real transport swap intact - and everything ambient that used to travel with a message did not. The retrospective, the ledger, and what I would take from it.