NoogaBytes
Back to Blog
EngineeringFebruary 2, 2026

Building Scalable Microservices: Lessons from the Trenches

After three years of building and maintaining a microservices architecture that handles over 10 million requests daily, I've learned that scaling isn't just about adding more servers—...

MF
Matt Forbush
8 min read
Building Scalable Microservices: Lessons from the Trenches

After three years of building and maintaining a microservices architecture that handles over 10 million requests daily, I've learned that scaling isn't just about adding more servers—it's about designing systems that can grow without becoming unmanageable. Here's what we got right, what we got wrong, and what I'd do differently today.

The Promise vs. The Reality

Microservices promised us independence, scalability, and fault isolation. What we got was distributed systems complexity, network latency, and the joy of debugging issues that span seven different services. But despite the challenges, the architecture has proven its worth when done thoughtfully.

Service Mesh Architecture

Key Lessons Learned

1. Start with a Monolith (Seriously)

Our biggest mistake was jumping straight into microservices for a greenfield project. We spent months building infrastructure instead of validating business logic. If you're starting fresh, build a well-structured monolith first. Split it later when you actually know where the boundaries should be.

2. Service Boundaries Are Business Boundaries

Don't split services by technical layers (API service, database service, etc.). Split them by business domains. Our OrderService, InventoryService, and PaymentService each own their data and business logic completely.

3. Observability Is Non-Negotiable

You can't troubleshoot what you can't see. We invested heavily in:

  • Distributed tracing with OpenTelemetry
  • Centralized logging with correlation IDs
  • Real-time metrics and dashboards
  • Automated alerting before customers notice issues
Distributed Tracing Dashboard

The Tech Stack That Actually Works

After multiple iterations, here's what we landed on:

  • Language: Go for services, TypeScript for BFF layers
  • Communication: gRPC for internal, REST for external
  • Service Mesh: Istio (controversial, but worth it at scale)
  • Orchestration: Kubernetes (yes, you probably need it)
  • Database: PostgreSQL per service, Redis for caching

What's Next?

We're experimenting with event-driven architectures using Kafka for better decoupling and eventually consistent systems. The goal isn't perfect consistency—it's resilient systems that keep running when (not if) things break.

Microservices aren't a silver bullet. They're a trade-off: you're trading simplicity for scalability and team autonomy. Make sure you actually need what they offer before paying the complexity cost.

EngineeringTechnicalBest Practices
MF
Matt Forbush

Data engineer and full-stack developer specializing in FDA-compliant systems, LIMS automation, and enterprise infrastructure. 20+ years building solutions for regulated industries.

Stay Updated

Get insights on data engineering, compliance automation, and technical strategy delivered to your inbox.

Need help with your project?

Let's discuss how I can help you build scalable, compliant solutions.

Book a Free Strategy Call