Monolithic architectures struggle as systems grow: a single deployment bottleneck, tightly coupled domains, and no clear ownership boundaries. I wanted to build a system that tackled these problems head-on. Multiple services that own their own data, communicate asynchronously, and handle failure gracefully.
The core problem: how do you coordinate a multi-step purchase transaction across independent services without a shared database? A user buying an item requires checking the catalog for pricing, debiting currency from their account, and granting the item to their inventory. Three services that each own a piece of the workflow. If any step fails, the others need to compensate. Getting this wrong means users lose currency without receiving items, or receive items without paying.
Beyond the transaction challenge, the system needed proper authentication and authorization (not every user should manage the catalog), resilient inter-service communication (one service going down shouldn't cascade), and a frontend that ties it all together seamlessly.