When is microservices the right choice, and when is it not?
Microservices make sense when you face genuine scale pressure, several teams need to work in parallel, you have polyglot stack requirements, you need fault isolation, or you want independent deployment cycles per business capability. For smaller teams, simpler applications or little delivery pressure, a modular monolith is almost always the wiser choice. In the first conversation, we help you honestly establish which direction to take. That is more often a no to microservices than you might expect.
What is the difference between a monolith and microservices in practice?
In a monolith, all business logic lives in one codebase, with one deployment and often one database. In a microservices architecture, each business capability is its own service with its own datastore, its own team ownership and its own deployment pipeline. You gain independent scalability and team velocity, but pay with greater operational complexity: distributed transactions, schema evolution, observability and service mesh. A modular monolith sits somewhere in between and is often a sensible intermediate step.
Do we really need Kubernetes for microservices?
Not absolutely, but in practice almost always. Kubernetes (managed through EKS, GKE, AKS or OpenShift) has become the standard for running containerised services with auto-scaling, self-healing and declarative deployments. Alternatives such as HashiCorp Nomad exist and sometimes suit smaller setups better. ECS, Cloud Run or App Runner can work for a handful of services. With more than ten services and multi-team velocity, Kubernetes almost always wins.
How do you approach a strangler fig migration?
We place an API gateway in front of the monolith and gradually route traffic to new services. For each capability, we identify the bounded context, build the new service with its own datastore, and synchronise data via change data capture or event bridges until the new service is the canonical source. The monolith keeps running until the last piece is removed. Priority goes to the capabilities with the highest delivery pain or the greatest scale pressure, not the most difficult core. See also our page on
having your platform migration carried out.
How many services should we have?
As few as possible to solve the problem. The right number follows from your business domain, not from a target figure. Start with coarse bounded contexts such as order, customer, pricing, payment and notification, and only split further when a service becomes too large for one team or when deployments start interfering with each other. Premature decomposition into thirty microservices is one of the most expensive mistakes we see.
How much should we invest in observability?
A lot — and it isn't an option but a requirement. Without distributed tracing (OpenTelemetry, Jaeger or Tempo), structured logs and service-level metrics, a microservices platform is simply not operable. We design observability as a first-class part of the platform, not as something squeezed into the last sprint. The rule of thumb: if you aren't willing to make time for observability, don't choose microservices.
How long does a microservices project take?
That depends heavily on scope: a greenfield platform with three or four core services can be in production within a number of sprints. A full strangler-fig migration of a large monolith is a multi-sprint project that often runs alongside business as usual. In the discovery phase, we give you a well-founded estimate based on the number of bounded contexts and the complexity of data migration.
How do you handle compliance — ISO 27001, NIS2, DORA, GDPR?
A separate audit trail per service, encryption in transit and at rest, role-based access via your identity provider, and infrastructure as code so that all changes are reviewable and reproducible. For financial institutions under DORA, we explicitly build for incident reporting, operational resilience and third-party risk. We handle GDPR aspects such as data minimisation and retention policies per service. For systems with strict uptime requirements, we often pair this architecture with a
high-availability system development project.
Which tech stack do you recommend for services?
We are polyglot — depending on the capability and your team's skills, we choose Node.js (TypeScript), Spring Boot, .NET, Go or Python (FastAPI) for backend services. For service-to-service communication we typically use gRPC for its type safety and performance, with REST or GraphQL for public APIs. Kubernetes is usually the deployment target, running on AWS (EKS), Azure (AKS), GCP (GKE) or, for cost-conscious setups, on Hetzner with managed Kubernetes. Data per service: PostgreSQL by default, Redis for caches, Elasticsearch for search functionality, and MongoDB or DynamoDB where document stores are more natural.
How do you handle distributed transactions and data consistency?
In a microservices architecture, classic ACID transactions spanning multiple services no longer exist. We use the saga pattern — a chain of local transactions with compensating actions on failure — implemented either as orchestration (one central saga coordinator) or choreography (services react to each other's events). For read models we apply CQRS where it makes sense, with event sourcing for capabilities where a complete audit history matters, such as payments or contracts. We are pragmatic: not every service needs event sourcing.