Monolith → Go Microservices
PlayHQ Sports — Melbourne, Sept 2019 – Sept 2024
- Go
- TypeScript
- gRPC
- Protobuf
- GraphQL
- RabbitMQ
- Kubernetes
- Helm
Problem
A single backend served every product surface. Teams could not ship independently, and the monolith gave us no language-neutral contract between the Go and TypeScript sides of the codebase.
Architecture
- ─GraphQL stays the client-facing edge — mutations, resolvers and data loaders written in Go and TypeScript.
- ─Internal service-to-service calls move to gRPC, with Protobuf as the shared message schema.
- ─Asynchronous work is modelled as event-driven services on RabbitMQ.
- ─Each new service ships with its own Kubernetes Helm chart.
Key decisions
- ◆Protobuf as the single source of truth for message schemas — one contract, generated clients on both languages.
- ◆Extract services incrementally around real seams instead of a big-bang rewrite, so the monolith keeps serving traffic throughout.
- ◆Keep Kafka topic provisioning inside the Helm chart, so infrastructure for a service is declared next to the service.
Results
- ✦Multiple Go services running on gRPC in production, with the monolith progressively carved back.
- ✦Reduced deployment time by 30% by optimising the end-to-end test suite for faster builds.
- ✦Cut build tooling licence spend by migrating CI from Drone to GitHub Actions.