All services
Service · Backend development

Backends that hold under load. Not just in the load test.

Peak traffic is not an accident. It arrives, with the campaign launch, the seasonal peak, the competitor’s outage. I build backends for SaaS products and platforms that survive that moment: in Go and PHP 8, event-driven on AWS, with tenant isolation and recovery designed in rather than bolted on.

Golang & PHP 8AWS Solutions Architect Professional20+ years of backend
What you get
  • An architecture and service split that fits your domains rather than a buzzword
  • Production-ready code with tests, a pipeline and a deployment strategy
  • Load tests with defensible numbers, so you know what the system takes
  • Monitoring, alerts and runbooks your team can run operations with
Scope & working together

Typical scope is three to nine months, part time or full time. An architecture or load review also works as a self-contained two week engagement.

Remote from Germany. Straight with me, no agency in between.

The starting point

It runs. Until the traffic arrives.

Most backends are not built wrong, they are built for a different order of magnitude. What works with ten thousand users tips over at a million in places nobody had on their radar: a database lock, a synchronous call inside a loop, a connection pool sized too small.

Then comes the second effect: systems under load do not fail all at once, they get slow. Timeouts stack up, retries amplify the load, and a bottleneck turns into a total outage. No bigger server fixes that. Only a design that absorbs backpressure does.

Typical symptoms
  • Deployments happen at night because they are too risky during the day.
  • One slow downstream service takes the whole system with it.
  • There is no number for how much load the system can take.
  • One large customer affects response times for everyone else.
  • Every integration against the API turns into a special case.
  • Only one person really understands the critical path.
What I do

Designed.
Resilient.
Handed over.

01

Load profile and bottleneck analysis

Load testingProfilingSLOLatency budget

Before any code, we establish what the system has to take: requests per second, the ratio of peak to average, the latency budget per call. Then I measure where it breaks today, with profiling and a load test rather than assumptions.

02

Service boundaries and decoupling

EventBridgeSQSIdempotencyDomain split

What does not have to be synchronous becomes asynchronous: queues, events, idempotent processing, dead letter queues for when it matters. The split follows domain boundaries rather than team boundaries, because it determines your operating cost later.

03

Go services on the hot path

GolanggRPCConcurrencyPHP 8

Where throughput and latency matter, Go is the pragmatic choice: small memory footprint, real concurrency, fast starts. Existing PHP stays where it belongs and gets connected cleanly, rather than everything being touched at once.

04

Tenant isolation and data

Multi-tenancyPostgreSQLDynamoDBValkey / Redis

Several customers on one infrastructure, without one large tenant dictating response times for the others: isolation at the data and load level, indexes and query paths that scale with you, and caching as a deliberate decision rather than a shortcut.

05

Load resilience and recovery

TimeoutsCircuit breakerMulti-AZRunbooks

Every call gets a time budget, every dependency a circuit breaker, every load level a point beyond which it gets shed deliberately. Multi-AZ as standard, recovery and restore rehearsed once against the clock, so nobody has to guess when it counts.

06

APIs and uneventful deployments

OpenAPI 3CI/CDBlue/greenFeature flags

The API gets specified before it gets implemented, OpenAPI for REST and Protobuf for gRPC, so integrations succeed without follow-up questions. Plus CI/CD with tests, blue/green deployments, feature flags for risky changes, and a rollback that has been practised. A release should be a non-event.

Should your backend survive the next peak?

Let’s spend 30 minutes on your load profile.

Book a call
Book a call
How it runs

From load profile to running system.

No waterfall. Every stage ends with something you can hold: a number, an environment or a release.

STEP 01

Establish the target

What the system has to take, who runs it, what is already fixed. 30 minutes is enough to tell whether it fits.

STEP 02

Analysis and design

Load profile, bottleneck measurement, target architecture with service boundaries. The result is a plan with an order and an effort estimate.

STEP 03

Building in increments

Delivered in steps that can go to production individually. Tests, pipeline and Terraform grow with it, not after it.

STEP 04

Harden and hand over

Load test against the agreed numbers, recovery rehearsed, runbooks, pairing until operations run without me.

The outcome

What you end up with.

Defensible numbers instead of hope

You know what your system takes, where the next limit sits, and what it costs to move it.

Failures stay local

An overloaded part does not drag the rest down. Backpressure gets absorbed rather than passed on.

Operations that stay in the team

Documented decisions, runbooks and a team that can keep building. No knowledge tied to one person.

Technologies I use

Proven tools. No experiments.

Languages
  • Golang
  • PHP 8
  • TypeScript
  • SQL
Platform
  • ECS Fargate
  • Lambda
  • EventBridge
  • SQS
  • Terraform
Data
  • PostgreSQL
  • MySQL
  • DynamoDB
  • Valkey / Redis
Operations
  • OpenTelemetry
  • CloudWatch
  • CI/CD
  • Blue/green
From practice
Common questions

Before you ask.

Do you build the frontend as well?

No. I build the backend, the interfaces and the infrastructure. For frontend and design I work with your team or the people you already use, and the coordination runs through the API contract, which is agreed up front. If you are looking for someone to deliver the complete product including the interface, I am the wrong person and I will say so in the first call.

Do we have to move to microservices for this?

No. A well-structured monolith beats plenty of distributed systems and is considerably cheaper to run. I split things only where there is a concrete reason: different load profiles, different release cycles, or team boundaries that would otherwise block permanently.

Do we need Kubernetes?

Often not. Kubernetes is a good tool when you have several teams, many services and people who can run the cluster. For most setups ECS Fargate gets there faster and costs less to operate. I decide that based on your team and your load, not on the trend.

Why Go rather than the language we already use?

Usually the existing language stays. I use Go deliberately where throughput, latency and memory footprint matter, as an additional service next to what you have, connected over gRPC or a queue. I have written up how that works without a rebuild in a separate article.

Do you write code yourself or only advise?

I write code. The design happens at the start, but most of the time goes into implementation, tests and the pipeline. In my experience, advice without implementation produces documents nobody reads.

Do you work with our existing team?

Yes, and that is the normal case. I work in pairs, document decisions as ADRs in the repository, and hand over before I leave. The goal is not dependence on me, it is a team that can keep building on its own.

Other services

What else I help with.