Skip to content
kc@kumarChandrachooda.com:~$ cd /blog/series/trill-the-microservices-spine && read --section="top" 0%
Series

Trill — The Microservices Spine

In reading order.

  • 15 parts
  • ≈ 100 min total
  • 15 published
Part 1 09 Dec 2025 7 min read

Nine Repos and No Map

The DevMentors Trill estate is a nine-service microservices sample spread over eleven sibling repositories with no README, no clone script and no bootstrap tooling - and the only artefact that names the whole system is a Visual Studio solution file.

Part 2 09 Dec 2025 6 min read

Three Runners, Four Inventories

Trill ships a PM2 ecosystem file, a Tye manifest and a Docker Compose file - three ways to start the estate that disagree about which services exist, plus a Prometheus config that scrapes a service two of them never launch.

Part 3 10 Dec 2025 7 min read

The Config Is a Promise the Code Never Made

Trill's appsettings files and package references describe caching, service discovery, health checks, dynamic secret leases and API documentation - and reading the source shows how much of that is never wired up at all.

Part 4 11 Dec 2025 7 min read

Durable Queues on an Ephemeral Disk

Every exchange and queue in the Trill estate is declared durable, and the RabbitMQ container that holds them has its volume commented out - Guaranteed Delivery configured at the broker and cancelled one file away.

Part 5 11 Dec 2025 7 min read

A Gateway That Publishes What It Cannot Name

Trill's API gateway turns HTTP posts into AMQP messages using eighty lines of middleware, a route template and a raw JSON blob - it publishes onto the estate's bus with zero compile-time knowledge of any contract, which is the exact inverse of what every other repo does.

Part 6 12 Dec 2025 7 min read

The Route Values It Throws Away

Trill's gateway parses the story id out of the URL, boxes it into a route-value dictionary, and uses the result as a boolean - so the synchronous and asynchronous versions of the same operation have different contracts and only one of them honours the URL.

Part 7 13 Dec 2025 6 min read

The Token Becomes a Body Field

Trill's gateway authenticates the caller, parses the subject claim out of the JWT and writes it into the request body as a userId - a Content Enricher at the edge that explains the whole estate's API shape, and carries four defects in fifty lines.

Part 8 13 Dec 2025 6 min read

The Policy That Was Never Applied

Trill's gateway declares an authenticatedUser authorisation policy exactly once and attaches it to nothing - and its identity middleware returns early when the Authorization header is absent, so a caller with no token at all can publish commands onto the estate's message bus.

Part 9 14 Dec 2025 7 min read

A Channel Is Not a Topic

Trill's push service fans stories out with a single System.Threading.Channels queue - which means every connected browser competes for the same message instead of all receiving it, and the class name is plural while the field is not.

Part 10 15 Dec 2025 6 min read

Every Disconnect Eats a Message

Trill's push service checks its cancellation token after dequeuing rather than before, so a disconnected client wins one more message from the shared queue and destroys it - and the Blazor client that consumes the stream never reconnects.

Part 11 15 Dec 2025 6 min read

The Filter That Drops the Future

Trill's push service gates stories on a visibility window and silently discards anything scheduled for later - a Message Filter where a delay was intended, with no scheduler, no delay queue and no re-delivery anywhere in the estate.

Part 12 16 Dec 2025 7 min read

A Saga That Cannot Compensate

Trill's ad-publication saga implements Compensating Action in five overrides and can reach none of them - the rejection events it subscribes to carry no correlating id, their handlers return Task.CompletedTask, and no handler ever throws.

Part 13 17 Dec 2025 7 min read

Two Contracts Drifted, Twelve Did Not

Trill has no shared contracts package - every consumer re-declares the publisher's event class by hand. Diffing all fourteen duplicated contracts shows exactly two have drifted, and the ratio is what makes copy-paste governance feel safe until it isn't.

Part 14 18 Dec 2025 6 min read

The Second Architecture, Switched Off by Comment

Trill contains a complete synchronous integration architecture - typed gRPC and HTTP clients, a live gRPC server, generated stubs, an options class - that was built, wired and then disabled by commenting out three lines across two repositories.

Part 15 18 Dec 2025 8 min read

Everything Observed, Nothing Survivable

Trill ships Jaeger, Prometheus, Grafana, Seq, Consul and Vault, and contains no circuit breaker, no dead-letter queue, no health check and no alert rule - the closing retrospective on what this estate gets right, what it does not, and when not to build a system this way.