Agricola Online
A real-time multiplayer adaptation of the board game Agricola — a Go game server with WebSockets and Redis-backed state, 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 — 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) — easy to test, 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.