Agricola Online
A real-time multiplayer adaptation of the board game Agricola, built on a Go game server with WebSockets and Redis-backed state and orchestrated on Kubernetes to scale game rooms on demand.
- Go
- WebSockets
- Redis
- Kubernetes
- Docker
- Microservices
The problem
Agricola is a turn-based worker-placement game for up to five players. I wanted to learn distributed systems on a problem that genuinely needs them, not a toy that’s containerized for show. A session-based, room-per-match game is exactly that problem.
What’s technically interesting
- A concurrency model that fits. One goroutine drives the authoritative game loop per active room, with channels for player actions and broadcasts for state changes. It’s the kind of workload Go is built for.
- A real rules engine. Agricola’s worker placement, resource economy,
harvest phases, and end-game scoring are modelled as a state machine with
pure transition functions (
apply(action, state) → state), making it easy to test and easy to snapshot. - State that survives pod churn. Game state is snapshotted to Redis after each committed turn, so any pod can serve a room and reconnections survive a restart.
- Orchestration with a reason to exist. Game-server pods scale horizontally on Kubernetes with player demand. The orchestration earns its place because the workload is naturally many independent sessions.
Stack
Go game server · WebSocket protocol (authoritative server, versioned state) · Redis for room/session state · Docker · Kubernetes (Deployments + HPA).
Status
In progress. The full architecture and build milestones are written up in
the project’s docs/agricola-architecture.md. I’m building it specifically to
deepen my Go and Kubernetes skills on a problem where they’re the right tools.