
The Event-Driven Monolith
Microservices are a distributed nightmare for early-stage companies. The Modular Monolith is the architecture of the future.
The Microservice Hangover
The tech industry is slowly recovering from a ten-year bender on microservices.
Seduced by engineering blogs from Netflix and Uber, startups with three engineers and 500 total users decided they needed to break their application into 45 independently deployable Docker containers. The result was not unprecedented scalability. The result was a distributed monolith: an architecture that possesses all the tight coupling of a monolith, but with the added joy of network latency, complex distributed tracing, and catastrophic partial failures.
We have realized that the organizational overhead of microservices rarely justifies the technical benefits for 99% of companies.
But we cannot simply revert to the tangled, synchronous monoliths of 2012.
Enter the Event-Driven Monolith
The Event-Driven Monolith (or Modular Monolith) is the synthesis of these two extremes.
It is deployed as a single application. It runs in a single process. It connects to a single primary database. This eliminates the massive DevOps overhead of orchestrating dozens of services.
However, internally, the application is strictly partitioned into bounded contexts (e.g., Billing, Inventory, User Management). Crucially, these contexts do not call each other synchronously.
If the User Management module creates a new user, it does not call a function in the Billing module to set up a subscription. Instead, it emits a UserCreated event to an internal, in-memory event bus. The Billing module listens for that event and reacts asynchronously.
The Best of Both Worlds
This architecture provides the deployment simplicity of a monolith with the logical decoupling of microservices.
If the Billing module throws an exception while processing the event, it does not crash the User Management module. The user still gets created successfully. The event can be retried or sent to a dead-letter queue.
Furthermore, if the company actually hits hyper-growth and the Billing module needs to scale independently, extracting it into a true microservice is trivial. The boundary is already defined by the asynchronous event contract.
Stop building distributed systems before you have a distributed systems problem. Build an event-driven monolith. It is the only architecture designed to gracefully evolve alongside your company.

Kai Cyrus
Founder, Builder, Investor