architecture

  • At-least-once, and the consumer that had to say so

    Every broker worth using delivers at least once, and every consumer that does not say how it handles that is claiming something it has not checked. Writing the…

  • Extracting a module without extracting a service

    A billing module everybody agrees should be separate, a team of four, and 88 classes that reference it. The boundary, drawn in code rather than in conversation.

  • A dead letter queue with an owner

    A dead letter queue that nobody owns is a queue where messages go to be forgotten, and ours had 8,000 of them. Owning a dead letter queue means…

  • The API gateway that was an nginx config

    Two services behind one hostname, with a routing table that somebody wanted to solve with a gateway product. A gateway earns its place when routing is dynamic, when…

  • The ubiquitous language that stopped at the ORM

    The domain layer talked about a consignment, the database called it a shipment, and both terms appeared in the same conversation with different meanings. Renaming the table was…

  • The factory that took a DTO and returned another DTO

    A class named OrderFactory whose only method mapped one flat structure onto another flat structure with different field names. The name mattered more than it should have: three…

  • The shared kernel that became a dumping ground

    A Shared namespace created for three value objects, containing 140 classes four years later. A shared kernel needs an admission rule or it becomes the place things go…

  • Readonly classes and the DTO that stopped needing a constructor

    8.2 on 8 December, and readonly applied to a whole class. readonly on every property, written out forty times.

  • A delivery record a subscriber can inspect

    A subscriber debugging a missing event has no visibility into whether it was sent, and the alternative to a delivery log is a support ticket. Returning an excerpt…

  • Larger runners, and the pipeline that was memory-bound

    October, larger runners, and a build that was swapping. A Node build that used 6 GB on a 7 GB runner.