This won't be a popular opinion/implementation.
I'm on dot net. And although I can deploy as microservices ( clean architecture with core, application, Infrastructure and api).
I seem to integrate the api into my app ( Eg. Add the api dll). So my app does the provisioning like a monolith.
It exposes all api controllers by default.
Messaging is internal always then ( domain vs Integration).
Overhead is practically none.
If I have a heavy component/api, I can split up an API and put nginx in front of it for routing and nats for Integration Events
So, basically I have a DDD app at the beginning with the strangler pattern already in place for scaling porpose.
Although none of my apps need scaling right now.
I also can do every deployment myself and more easily. Since I don't have a deployment complexity currently.
--
What I don't have, is that my stack is language agnostic at the beginning. But it could be using the same method as scaling, with nginx.
It seems that I have the best of both worlds at the beginning.
- maintainability by forcing DDD
- minimal devops
- testability
- no service mesh overhead ( eg. Consult brings a 30-50ms average overhead, I finish most of my requests in 8-12ms)
- fast development ( slower than monolith, much faster then microservice)
While scaling could be refactored within the day, if an insane amount of request come in ( see: refactoring)
Most microservices are fixed within a single language though. So that's not a concern currently.
The added benefit is, is that I have insane custom implementation options.
I just need to change the Infrastructure in a deployment to use a clients database as a source if a component needs it.
( Eg. An order service for a webshop. I can easily integrate with an clients existing magento for a niche of their shop)
TLDR: I currently don't have a devops overhead. I'm too small for that, I'm glad though.
--
if anyone thinks that isn't a good solution for my use-case ( small dev shop) or have any better ideas. Please share ;)