Monorepo vs. polyrepo til mikroservices
Kontekst
Vores mikroservicearkitektur var vokset til over 30 services fordelt på separate repositories. Det blev stadig sværere at koordinere ændringer på tværs af services.
Beslutning
Samle alle services i et monorepo med Nx
Overvejede alternativer
Beholde separate repositories (polyrepo)
- Klare ejerskabsgrænser
- Uafhængige deployment-pipelines
- Mindre repository-størrelse
- Svært at koordinere breaking changes
- Delt kode kræver separate npm-pakker
- Inkonsistente værktøjer på tværs af repositories
- Sværere at håndhæve standarder
Bruge Git-submoduler
- Bevarer separate repositories og giver samtidig et samlet overblik
- Kan stadig have uafhængig CI/CD
- Git-submoduler er berygtet svære at arbejde med
- Løser ikke problemet med delt kode
- Ekstra kompleksitet uden klare fordele
Begrundelse
Et monorepo med Nx giver det bedste fra begge verdener: atomare commits på tværs af services, fælles værktøjer og standarder, nem kodedeling, samtidig med at uafhængige deployment-muligheder bevares. Den forbedrede udvikleroplevelse og muligheden for at refaktorere på tværs af servicegrænser opvejer indlæringskurven ved at tage Nx i brug.
Problemet
Med over 30 repositories stod vi over for flere udfordringer:
- Koordinering af ændringer: En breaking API-ændring krævede pull requests på tværs af 5-10 repositories
- Delt kode: Fælles hjælpefunktioner blev kopieret eller udgivet som npm-pakker
- Inkonsistente værktøjer: Hvert repository havde lidt forskellig linting-, test- og build-konfiguration
- Onboarding: Nye udviklere skulle klone og opsætte flere repositories
Hvorfor Nx?
Vi evaluerede flere monorepo-værktøjer:
- Lerna: Primært til npm-pakkehåndtering, mindre velegnet til services
- Turborepo: Godt til build-caching, men mindre meningsfuld om struktur
- Nx: Omfattende værktøjer med god caching, kodegenerering og afhængighedsgraf
Nx vandt på grund af sin fremragende TypeScript-understøttelse, kraftfulde caching og aktive community.
Migreringsproces
- Oprettede nyt monorepo med Nx
- Migrerede services én ad gangen, startende med de mindst kritiske
- Samlede delt kode i biblioteker
- Opdaterede CI/CD til at bruge Nx’ “affected”-kommandoer
- Trænede teamet i monorepo-workflows
Resultater efter 3 måneder
- Refaktoreringstid på tværs af services reduceret med 70 %
- Build-tider forbedret med 50 % takket være Nx-caching
- Øget brug af delt kode (mindre duplikering)
- Onboardingtid for nye udviklere halveret
- Teamet rapporterer højere tilfredshed med udviklingsworkflowet
Migreringen var udfordrende, men fordelene har været betydelige.