Microservices Migration

EdTech / E-Learning

3x

Performance improvement

60%

Reduced memory usage

0

Downtime during migration

Overview

CloudAcademy needed to migrate their content authorization service from Kotlin to Go as part of a broader standardization effort. I led this migration while ensuring zero downtime and creating new microservices following DDD patterns.

Business Context

CloudAcademy is a leading e-learning platform for cloud technology training. Their content authorization service, originally written in Kotlin, had become a bottleneck. The service was responsible for determining which content each user could access based on their subscription, role, and organization. With millions of daily authorization checks, performance was critical. The team had standardized on Go for new services and wanted consistency.

Challenge

Legacy Kotlin service had performance bottlenecks and was difficult to maintain. Team needed to standardize on Go for better consistency across microservices.

  • Kotlin service with complex business logic and high traffic
  • Need for zero-downtime migration
  • Team unfamiliar with Go best practices

Solution

We executed a careful migration using strangler fig pattern, gradually routing traffic to the new Go service while maintaining full backward compatibility.

  • Migrated content authorization microservice from Kotlin to Go
  • Created new Go microservices following DDD patterns
  • Built Python dev-ex tool to orchestrate local containers

Approach & Methodology

We used the strangler fig pattern to gradually migrate traffic from Kotlin to Go. First, we built thorough integration tests against the existing Kotlin service to establish a behavioral contract. Then we implemented the Go version, running both services in parallel and comparing outputs for 2 weeks. Traffic was shifted gradually: 1% → 5% → 25% → 50% → 100%, with automated rollback triggers if error rates increased.

Implementation Details

Strangler Fig Migration

Implemented gradual traffic shifting using feature flags and A/B testing to validate the new Go service before full cutover. Maintained dual-write capability during transition.

Developer Experience Tooling

Built a Python CLI tool to orchestrate local development environments, making it easy for developers to run the entire microservices stack locally with Docker Compose.

Key Decisions

  • Chose strangler fig over big-bang rewrite to minimize risk and enable continuous delivery throughout migration
  • Built comparison tooling to verify identical behavior between old and new services before any traffic shift
  • Invested in a Python dev-ex CLI tool to simplify local development across 20+ microservices

Tech Stack

Go Python AWS Kubernetes Docker gRPC PostgreSQL

Related Services

The following services were utilized in this project to deliver successful outcomes.

Lessons Learned

  • Having comprehensive integration tests before migration is non-negotiable - they caught 3 edge cases our unit tests missed
  • Go's simplicity and explicit error handling made the new codebase significantly easier to maintain than the Kotlin version
  • Developer experience tooling has outsized ROI - the CLI tool we built is now used by the entire engineering team

Project Information

Timeline

3 months for migration, 2 months follow-up

Team

2 developers (I led the migration)

Results

3x

Performance improvement

60%

Reduced memory usage

0

Downtime during migration

Have a Similar Challenge?

Let's discuss how I can help your project succeed with proven architecture and AI solutions.