Monorepo vs. polyrepo til mikroservices

architecturemonorepodeveloper-experiencetooling

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.

Samle alle services i et monorepo med Nx

Beholde separate repositories (polyrepo)

Fordele
  • Klare ejerskabsgrænser
  • Uafhængige deployment-pipelines
  • Mindre repository-størrelse
Ulemper
  • 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

Fordele
  • Bevarer separate repositories og giver samtidig et samlet overblik
  • Kan stadig have uafhængig CI/CD
Ulemper
  • Git-submoduler er berygtet svære at arbejde med
  • Løser ikke problemet med delt kode
  • Ekstra kompleksitet uden klare fordele

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

  1. Oprettede nyt monorepo med Nx
  2. Migrerede services én ad gangen, startende med de mindst kritiske
  3. Samlede delt kode i biblioteker
  4. Opdaterede CI/CD til at bruge Nx’ “affected”-kommandoer
  5. 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.