Skip to content
kc@kumarChandrachooda.com:~$ cd /blog/archive && read --section="top" 0%
Archive

Every article

Newest first, grouped by year. Search or filter by topic.

  • 556 articles
  • 152 matching
Microservices 21 Dec 2025

The Refactor That Stopped Halfway

Trill's last commit built a complete domain-event pipeline - dispatcher, mapper, handlers - and migrated one of the two command handlers onto it. The other still constructs its aggregate directly, so one domain event is never raised and a reputation gate can never fire.

Microservices 20 Dec 2025

The Factory That Doesn't Own Construction

Trill extracts story-text validation into an IStoryTextFactory and leaves the value object's constructor public - plus an implicit conversion from string, so any assignment builds an unvalidated StoryText in one keystroke.

Microservices 20 Dec 2025

Title and Text, Swapped Since Commit One

StoryDocument.ToEntity passes the body where the title goes and the title where the body goes. It compiles because of one implicit conversion operator, and it has survived since the first commit because the only code path that would notice is dead.

Microservices 19 Dec 2025

Two Services, Two Architectures

Trill's Stories service is four projects with a dependency-free domain at the bottom. Its Users service is two projects with everything in one assembly - same author, same week, same estate, opposite answers to what a layer is.

Microservices 18 Dec 2025

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.

Microservices 18 Dec 2025

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.

Microservices 17 Dec 2025

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.

Microservices 16 Dec 2025

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.

Microservices 15 Dec 2025

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.

Microservices 15 Dec 2025

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.

Microservices 14 Dec 2025

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.

Microservices 13 Dec 2025

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.

Microservices 13 Dec 2025

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.

Microservices 12 Dec 2025

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.

Microservices 11 Dec 2025

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.

Microservices 11 Dec 2025

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.

Microservices 10 Dec 2025

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.

Microservices 09 Dec 2025

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.

Microservices 09 Dec 2025

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.

Architecture 15 Nov 2025

The Road Out of the Monolith

Which of ModularMonolith's three modules could become a service tomorrow, what blocks the other two, and the hardening bill the sample never pays - a retrospective on the modular monolith as a station, not a destination.

.NET 04 Nov 2025

The Price of No Shared Kernel

The retrospective, with the ledger totalled - seven byte-identical MessageBrokers, one AggregateRoot with three meanings, what Convey genuinely optimises, where a Convey.Bootstrap meta-layer should have stood, and what a consumer should copy from this estate.

Microservices 27 Oct 2025

Cartography of a Successor

The series retrospective - what fourteen parts of reading Pacco as a system of systems actually taught, the absences the estate confesses when you list them together, how the successor evolved past DShop and where it stopped, and what the MIT licence makes of all of it.

.NET 27 Oct 2025

The Convey Consumer Tax

Convey sells a microservice in thirty lines, and Pacco builds ten of them - this series reads the whole estate to price what the framework compresses and what every consumer pays for by hand. Part 1 of The Convey Consumer Tax.

Microservices 26 Oct 2025

The Message Map and the Wrong Exchange

The estate's full who-publishes-what matrix, built from the source - and the one broken cell in it. Orders' copied ParcelDeleted event declares the deliveries exchange while Parcels publishes on parcels, so Orders never learns a parcel was deleted, and neither the Pact tests nor the hand-maintained registry can catch it.

Microservices 25 Oct 2025

Observability With Amnesia

Pacco traces every request, scrapes every service every five seconds and ships every log line to Seq - then forgets all of it on docker-compose down, because the telemetry stores are the containers whose volume blocks are commented out. The wiring is exemplary; the memory is the finding.