3.14

Se på engelsk

3.14 Multitenancy og SaaS-arkitektur

Overblik og motivation

Multitenancy er praksissen at køre én instans af din software, så den betjener mange separate kunder på én gang, mens hver kundes data og konfiguration holdes logisk adskilt, og de deler den samme kode og ofte den samme infrastruktur. Hver kunde er en tenant. Denne ene idé er den økonomiske motor i software as a service (SaaS), modellen hvor du sælger adgang til en kørende applikation frem for en kopi til installation. Når tusind tenants deler den samme udrulning, patcher du én gang, skalerer ét system, og den marginale omkostning ved næste kunde nærmer sig nul. Derfor kan et veludbygget multitenant produkt betjene et startup på to personer og en virksomhed med hundrede tusind brugere fra den samme kodebase, og derfor former den tenancy-model, du vælger, dine marginer, din sikkerhedsholdning og din driftsbelastning i årevis.

For store teams er indsatsen dybere end omkostning. Multitenancy stiller et hårdt krav i centrum af din arkitektur: tenant A må aldrig se tenant B’s data, aldrig, under nogen fejl, kapløbstilstand eller fejlkonfiguration. Et enkelt datalæk på tværs af tenants kan ende et firma. Samtidig er hele pointen med at dele effektivitet, så hver designbeslutning sidder på et spektrum mellem stærk isolation (sikrere, dyrere) og tæt deling (billigere, mere risikabelt). At få det rigtigt er forskellen mellem et produkt, der skalerer elegant, og et, der enten ruinerer dig på infrastruktur eller lander dig i overskrifterne. Dette kapitel bygger på cloudarkitektur (kapitel 3.11), læner sig tungt op ad dataarkitektur (kapitel 3.4) og cloudsikkerhed (kapitel 4.3) og hænger sammen med skalerbarhed og robusthed (kapitel 3.5) og omkostningstilskrivning (kapitel 9.4).

Virksomheder og det offentlige hæver barren yderligere. Virksomhedskøbere forhandler kontraktlige datagarantier, kræver dedikeret isolation for deres niveau og forventer, at du migrerer dem mellem miljøer uden nedetid. Det offentlige tilføjer dataresidenslove, klassifikationsdrevet adskillelse og et hyppigt krav om, at hver myndighed er sin egen tenant med sin egen revisionsgrænse. Tenancy-beslutningerne her er ikke implementeringsdetaljer; de er tilsagn, du giver til hver kunde, der betror dig deres data.

Grundprincipper

  • Isolation er et spektrum, ikke en kontakt. Silo-, pool- og bridge-modellerne afvejer effektivitet mod adskillelse; vælg pr. niveau og pr. ressource, ikke én gang for alt.
  • Tenantkontekst er hellig. Hver anmodning, forespørgsel, loglinje og baggrundsjob skal bære en tenantidentifikator, og hver dataadgang skal afgrænses af den.
  • Et læk på tværs af tenants er den fejl, der betyder mest. Design, så et enkelt manglende filter ikke kan blotlægge en anden tenants data; forsvar i dybden, ikke én WHERE-klausul.
  • Støjende naboer er et arkitekturproblem. Uden kvoter og retfærdighed forringer én tung tenant alle andre; planlæg for det, før det sker.
  • Konfiguration pr. tenant skalerer; kode pr. tenant gør ikke. Bøj produktet med data og flag, ikke med forks.
  • Tenantens livscyklus er en produktfunktion. Onboarding, provisionering, offboarding og dataeksport skal være førsteklasses, automatiserede og reviderbare.
  • Du kan ikke styre det, du ikke kan tilskrive. Observerbarhed og omkostning skal skæres pr. tenant, ellers flyver du blindt på både pålidelighed og margin.

Anbefalinger

Vælg en tenancy-model pr. niveau langs spektret mellem isolation og effektivitet

Tre modeller forankrer spektret. I silo-modellen (dedikeret) får hver tenant sin egen isolerede stak: separat beregning, separat database, nogle gange en separat konto eller et separat netværk. Isolationen er stærkest, og sprængradien af en fejl er én tenant, men du betaler for ledig kapacitet pr. kunde og driver mange kopier. I pool-modellen (delt) deler alle tenants den samme beregning og database, adskilt kun af logik og en tenantidentifikator. Effektiviteten er højest, og den marginale omkostning ved en tenant er nær nul, men isolationen afhænger nu helt af, at din kode er korrekt. Bridge-modellen (hybrid) blander de to: delt beregning med databaser pr. tenant, eller en delt pool til små tenants og dedikerede siloer til store eller regulerede.

Vælg ikke én model til hele produktet. Det rette svar er som regel en bridge, der afbildes på dine prisniveauer. Læg den lange hale af små tenants i en effektiv delt pool, hvor deres økonomi hænger sammen. Tilbyd en dedikeret eller single-tenant-udrulning som et premiumniveau til virksomhedskunder, der vil betale for isolationen og de kontraktlige garantier. Skriv afbildningen ned som et arkitekturbeslutningsregister (kapitel 3.11), for “hvilke tenants deler hvad” er en påstand, dine sikkerheds-, salgs- og finansteams alle afhænger af.

Partitionér data bevidst, og gør tenantafgrænsning umulig at glemme

Data er der, hvor multitenancy lever eller dør, så behandl partitioneringsvalget som en central dataarkitekturbeslutning (kapitel 3.4). Tre strategier løber parallelt med tenancy-modellerne. Separat database pr. tenant giver den stærkeste isolation, nem backup og gendannelse pr. tenant og simpel dataeksport, til prisen af mange databaser at drive og skemamigreringer at sprede ud. Separat skema pr. tenant inden for en delt database er en mellemvej: én server, logisk adskillelse, stadig mange objekter at migrere. Delte tabeller nøglet på en tenantkolonne, hvor hver række bærer et tenant_id, er den tætteste og billigste og den farligste, fordi en enkelt forespørgsel, der mangler sit tenantfilter, nu lækker data på tværs af kunder.

Hvis I deler tabeller, så stol ikke på, at udviklere husker filteret. Håndhæv tenantafgrænsning i et lag, der ikke kan omgås: databasens row-level security, der knytter et obligatorisk prædikat til hver forespørgsel baseret på sessionens tenant, et ORM eller dataadgangslag, der injicerer tenantklausulen automatisk, eller begge. Livrem og seler er rigtigt her. Efterhånden som tenants vokser, bliver sharding efter tenant naturligt: placér grupper af tenants på forskellige databaseshards, så ingen enkelt instans holder alle, hvilket også begrænser sprængradien af et enkelt shards fejl og lader jer flytte en stor tenant til sit eget shard uden at ændre modellen.

Propagér tenantkontekst overalt, og forsvar i dybden mod læk på tværs af tenants

Tenantidentifikatoren skal følge med hver arbejdsenhed. Etablér den ved kanten, typisk fra den autentificerede session eller et subdomæne, valider den, og træk den gennem anmodningskonteksten, hvert nedstrøms tjenestekald, hver databasesession, hvert jobbet i kø og hver loglinje og måling. De farlige huller er de asynkrone: en baggrundsworker, der behandler et job uden at genetablere tenantkontekst, en cache nøglet uden tenanten, en webhookhåndterer, der stoler på en tenantidentifikator fra kalderen. Hver er en vej til at servere én tenants data til en anden.

Behandl isolation på tværs af tenants som en sikkerhedsegenskab med forsvar i dybden, og overlad detaljerne til kapitel 4.3. Anvend princippet om mindst privilegium, så selv en kompromitteret komponent kun kan nå den tenant, den handler for. Accepter aldrig en tenantidentifikator fra klientstyret input til autorisationsbeslutninger; udled den fra den autentificerede identitet. Navngiv caches, objektlagerpræfikser og søgeindekser efter tenant, så en nøglekollision ikke kan krydse grænsen. Test derefter grænsen med vilje: automatiserede tests, der hævder, at tenant A’s legitimationer ikke kan læse tenant B’s poster, og periodiske red team-øvelser, der forsøger at bryde ud af en tenant. Et læk fundet af jeres testsuite er en fejl; et læk fundet af en kunde er en krise.

Indgræns støjende naboer med kvoter, hastighedsgrænser og retfærdighed

Når tenants deler ressourcer, bliver én tenants spids alles nedbrud. Dette støjende-nabo-problem er ikke et grænsetilfælde; det er standardadfærden for en delt pool under belastning. Design imod det fra begyndelsen. Sæt kvoter pr. tenant på de ressourcer, der betyder noget (anmodninger pr. sekund, samtidige job, lager, forespørgselsomkostning), og håndhæv dem med hastighedsbegrænsning ved kanten og ved dyre interne grænser. Foretræk retfærdig planlægning, der giver hver tenant en andel, frem for først-til-mølle-køer, der lader én tenant sulte resten.

Afstem håndhævelsen med din tenancy-model. I en delt pool er kvoter og retfærdighed det primære forsvar, så invester i dem. For en tenant, hvis belastning reelt overstiger, hvad retfærdig deling kan absorbere, er svaret ofte at promovere dem ud af poolen til en bridge- eller silo-udrulning, hvilket er en funktion, du kan sælge, frem for en fiasko. Bind dette til dit arbejde med skalerbarhed og robusthed (kapitel 3.5): belastningsafkastning, circuit breakers og modtryk skal alle være tenantbevidste, så afkastning af én tenants overskydende belastning beskytter de andre i stedet for at forringe hele systemet.

Konfigurér tenants med data, ikke forks af din kode

Hver kunde vil have noget lidt anderledes: deres logo, deres arbejdsgangsregler, deres integrationer, et felt, du ikke har. Den skalerbare måde at sige ja på er konfiguration pr. tenant: funktionsflag, indstillinger, rettigheder og udvidelsespunkter, der er data, evalueres ved kørsel og deles af én kodebase. Den vej, der ødelægger en SaaS-forretning, er kode pr. tenant: en gren eller en fork eller et særtilfælde i kodestien for en stor kunde. Ti af dem, og du har ikke længere ét produkt, du har ti produkter i en trenchcoat, og hver ændring skal testes ti gange.

Træk en fast streg. Modellér de variationsakser, du er villig til at understøtte, som førsteklasses konfiguration, og behandl anmodninger uden for disse akser som enten produktkøreplan eller et fast nej. Når en kunde har brug for ægte tilpasning, så giv dem udvidelsespunkter (webhooks, en API, plugins, brugerdefinerede felter), der kører deres logik uden at forgrene din. Forbehold ægte skræddersyede udrulninger til single-tenant-premiumniveauet, hvor isolationen er pointen, og den højere pris dækker driftsomkostningen.

Gør tenantens livscyklus automatiseret, observerbar og omkostningstilskrevet

Onboarding af en tenant bør være et selvbetjent, automatiseret flow: provisionér tenantens datapartition, så standardværdier, sæt rettigheder, og vær klar på sekunder, ikke en ticket til et driftsteam. Offboarding betyder lige så meget og er lettere at forsømme. Når en tenant forlader jer, skal I kunne eksportere deres data i et brugbart format og derefter slette dem bevisligt, fordi kontrakter og privatlivslovgivning vil kræve begge dele. Design dataeksport og sletning fra dag ét; at eftermontere dem i et delt-tabel-skema er smertefuldt.

Instrumentér alt pr. tenant. Tag logs, spor og målinger med tenantidentifikatoren, så I kan besvare “er dette nedbrud alle tenants eller én?” og “hvilken tenant driver denne omkostning?” på sekunder. Tilskriv infrastrukturomkostning til tenants, så I kender jeres sande margin pr. kunde og kan få øje på den tenant, hvis forbrug gør dem urentable til deres nuværende pris (kapitel 9.4). Tenantbevidst observerbarhed og omkostningstilskrivning forvandler multitenancy fra en sort boks til et system, I faktisk kan drive og prissætte.

Afvejninger: fordele og ulemper

Tenancy-modelFordeleUlemper
Silo (dedikeret stak pr. tenant)Stærkeste isolation, mindste sprængradius, nem compliance og eksport pr. tenant, simpel historie om støjende naboerHøjeste omkostning, ledig kapacitet pr. tenant, mange kopier at drive og patche
Pool (fuldt delt)Laveste marginale omkostning, tætteste pakning, ét system at skalere og opgradereIsolation afhænger helt af kodens korrekthed, værste risiko for støjende naboer, sværeste eksport og sletning pr. tenant
Bridge (hybrid, niveaudelt)Effektiv for små tenants, dedikeret isolation for store, afbilder til prissætningFlere modeller at bygge og drive, en promoveringssti mellem niveauer at vedligeholde
Delt DB, delt skema (tenantkolonne)Billigste lager, én migrering, simpleste driftEt enkelt manglende filter lækker data; kræver row-level security som sikkerhedsnet
Delt DB, skema pr. tenantLogisk isolation, én server, fornuftig eksportMange skemaobjekter, migreringer spredes ud, skaleringsgrænser pr. server
Database pr. tenantStærk dataisolation, backup og eksport pr. tenantMange databaser, migreringsudbredelse, højere omkostning

Den centrale spænding er isolation versus effektivitet, og den løber gennem hver række. Tættere deling multiplicerer dine marginer og multiplicerer din risiko i samme bevægelse; stærkere isolation køber sikkerhed og enkelhed til en reel omkostning pr. tenant. Løsningen er ikke at vælge én pol, men at placere hver tenant bevidst langs spektret, som regel efter niveau: pak de små tenants tæt, hvor økonomien kræver det, og risikoen er afgrænset, isolér de store og regulerede tenants, hvor de vil betale for det, og sprængradien skal være lille. Gør derefter den tætte ende sikker med håndhævet tenantafgrænsning, og gør den isolerede ende billig med automatisering, så ingen af polerne gør så ondt som den naive version ville.

Spørgsmål til drøftelse med dit team

  1. Hvis ét tenantafgrænsningsfilter manglede i morgen, ville en kunde så se en anden kundes data? Dette er spørgsmålet, der adskiller et forsvarligt multitenant produkt fra en ulykke, der venter på at ske. Den ærlige test er at spore en reel læsesti og spørge, hvad der håndhæver tenantgrænsen: er det én udviklerskrevet WHERE-klausul, eller findes der et sikkerhedsnet som databasens row-level security eller et dataadgangslag, der injicerer afgrænsningen uanset hvad? Tag jeres faktiske forespørgselsstier, jeres baggrundsjob og jeres caches med, for læk gemmer sig næsten altid i det asynkrone hjørne, ingen afgrænsede. Tag også resultaterne af en test med, der bevidst bruger tenant A’s session til at anmode om tenant B’s poster og hævder en afvisning. Hvis grænsen hviler på menneskelig årvågenhed alene, har I et latent brud, og rettelsen (forsvar i dybden) bør springe til toppen af backloggen.

  2. Hvilken tenancy- og datapartitioneringsmodel bruger hvert kundeniveau faktisk, og svarer den til det, vi solgte dem? Mange teams glider ind i én enkelt model som standard og opdager så, at deres prissætning og deres arkitektur er uenige: virksomhedskunder blev lovet isolation, den delte pool ikke giver, eller små kunder sidder i dyre dedikerede stakke, der ødelægger marginen. Afbild hvert niveau til dets reelle model (silo, pool eller bridge; database pr. tenant, skema eller delt tabel) og læg det ved siden af de kontraktlige datagarantier, jeres salgsteam giver. Hvor de afviger, har I enten en compliance-risiko eller et omkostningsproblem, og begge er værd at bringe frem, før en kunde eller en revisor finder dem. Beviset at tage med er niveau-til-model-afbildningen, omkostningen pr. tenant og den faktiske ordlyd i jeres virksomhedskontrakter.

  3. Når en stor tenants belastning spidser, hvem andre mærker det, og hvad er vores plan? I en delt pool er svaret ofte “alle,” og teams ved ofte ikke dette, før en hændelse gør det åbenlyst. Gå igennem, hvad der sker, når jeres største tenant kører en massiv import eller får en trafikbølge: indgrænser kvoter pr. tenant og retfærdig planlægning det, beskytter belastningsafkastning naboerne, eller forringes hele systemet samlet? Tag belastningsdata og historien om jeres seneste hændelse med støjende nabo med, for den tenant, der skader jer, er som regel en, I kan nævne ved navn. Svaret bør forme både jeres investering i hastighedsbegrænsning og jeres niveaustrategi, da den reneste rettelse for en tenant, der vokser ud af retfærdig deling, er at promovere dem til en bridge- eller dedikeret udrulning, I kan tage betaling for.

  4. Når en tenant offboarder i morgen, kan vi så række dem en ren eksport og bevise, at vi slettede hvert spor, eller ville vi famle? Offboarding er den del af tenantens livscyklus, teams forsømmer, til en kontraktlig udtrædelsesklausul eller en privatlivsanmodning tvinger sagen, og da gør det delte skema udtræk og sletning smertefuldt. For et stort team akkumuleres risikoen, fordi en tenants data er spredt over primærdatabasen, caches, objektlager, søgeindekser, backups og analysepipelines, og hver skal eksporteres i et brugbart format og derefter bevisligt udslettes. De modstridende hensyn er reelle: tætte delte tabeller, der giver jer billigt lager, er netop dem, der gør udtræk og sletning pr. tenant sværest, så den effektivitet, I købte i lagerlaget, kan I betale tilbage ved udgangen. Tag en live gennemgang af en offboarding på en reel tenant med, listen over hvert lager, der holder tenantdata, og dokumentationen, I ville vise for, at sletning faktisk skete. For virksomheds- og offentlige tenants skal eksporten være certificeret og sletningen bevislig for at opfylde offentlighedslove og privatlivslovgivning, så behandl en manglende sletningssti som en compliance-defekt, der skal lukkes nu, ikke en funktion at tilføje, når en kunde forlader jer.

  5. Hvor mange enkeltstående særtilfælde for individuelle kunder bor allerede i vores kodesti, og hvor er den grænse, vi nægter at krydse? Kodeforks pr. tenant er den stille måde, hvorpå en SaaS-forretning holder op med at være ét produkt og bliver til mange produkter under ét navn, hvor hver ændring skal testes mod hvert særtilfælde, og hastigheden henfalder, efterhånden som I tilføjer kunder. Spændingen er, at en stor kunde med et reelt behov er svær at afvise, og en gren i kodestien føles hurtigere end at bygge en konfigurationsflade, så særtilfældene hober sig op, én rimelig undtagelse ad gangen. Tag en ærlig opgørelse med: søg i kodebasen efter kundenavne og niveauspecifikke grene, tæl dem, og estimér den ekstra test- og gennemgangsomkostning, hver pålægger en urelateret ændring. Drøftelsen bør trække en fast streg mellem variation, I modellerer som førsteklasses konfiguration (flag, rettigheder, udvidelsespunkter), og ægte skræddersyet arbejde, I forbeholder et single-tenant-premiumniveau, hvor den højere pris dækker driftsomkostningen. For virksomhedskøbere, der kræver dyb tilpasning, er det holdbare svar udvidelsespunkter, der kører deres logik uden at forgrene jeres, så styring og revision forbliver overskuelige på tværs af flåden.

  6. Kan vi pr. tenant fortælle både, hvad en hændelse koster hvem, og hvilke kunder der er urentable til deres nuværende pris? Multitenancy bliver en sort boks i det øjeblik, jeres logs, spor, målinger og infrastrukturomkostning ikke bærer en tenantdimension, for da kan I ikke besvare, om et nedbrud er én tenant eller hele flåden, og I kan ikke nævne den tenant, hvis forbrug gør dem til et tab til kontraktprisen. For et stort team er denne tilskrivning, hvad der adskiller at drive platformen fra at gætte på den, og den former direkte både pålidelighedsrespons og prissætning. Hensynene trækker mod instrumenteringsomkostning og kardinalitet: at tagge alt efter tenant er ikke gratis, og målinger med høj kardinalitet belaster jeres observerbarhedsbudget, så I vælger bevidst, hvad I skærer pr. tenant, og hvad I sampler. Tag jeres nuværende dækning af tenant-tagging med, en reel forespørgsel, der tilskriver cloududgift til en enkelt tenant, og marginetabellen, der ville lade jer nævne jeres mindst rentable kunde. I virksomheds- og offentlige sammenhænge fodrer omkostning pr. tenant og revisionsafgrænset observerbarhed også viderefakturering, kapacitetsplanlægning og den revisionsgrænse, hver myndighed eller forretningsenhed har ret til, så tenantdimensionen er et styringskrav lige så meget som et driftsmæssigt.

Sektorperspektiv

Startup. Lever en enkelt delt pool fra dag ét, og læg din knappe ingeniøropmærksomhed i det ene, der ikke kan eftermonteres: håndhævet tenantafgrænsning. En administreret Postgres med row-level security, et tenant_id på hver tabel og tenantkontekst løst ved kanten køber sikker tæthed uden et driftsteam. Byg ikke silo-niveauer eller infrastruktur pr. tenant spekulativt; tilføj et bridge-niveau kun, når en betalende virksomhedsprospekt gør isolationen dens omkostning værd.

Lille virksomhed. Uden en platformsspecialist og med et stramt budget så støt dig til det, din sky og dit framework allerede giver, frem for selv at bygge isolationsmaskineri. Administrerede databaser med row-level security, en platform-as-a-service der afgrænser tenants for dig, og en autentificeringsudbyder der bærer tenantidentitet er som regel billigere og sikrere end hjemmelavede ækvivalenter. Behandl multitenancy som en køb-versus-byg-beslutning i hvert lag, og forbehold skræddersyet arbejde til de tenantgrænsetests, som kun du kan skrive.

Stor virksomhed. Problemet er porteføljestyring på tværs af mange teams: en niveaudelt bridge-arkitektur, et arkitekturbeslutningsregister, der afbilder hvert niveau til dets tenancy- og datapartitioneringsmodel, og omkostningstilskrivning pr. tenant, så økonomien kender den sande margin på hver konto. Standardisér propageringen af tenantkontekst og afgrænsningssikkerhedsnettet, så intet team genopfinder dem, budgettér isolations- og livscyklusautomatiseringen eksplicit, og hold en understøttet, prissat sti til at migrere en tenant mellem niveauer uden nedetid, efterhånden som de vokser, eller deres compliancebehov ændrer sig.

Offentlig sektor. Indkøb, dataresidens og offentlig ansvarlighed driver modellen. Fastlås hver myndigheds data til regioner i landet med policy-as-code, læg følsomme eller højt klassificerede arbejdsbyrder i siloer i separate konti med deres egen revisionsgrænse, og giv hver myndighed sin egen identitetsintegration, opbevaringsregler og revisionsspor, så én myndigheds revisorer aldrig ser en andens aktivitet. Offboarding skal producere en certificeret eksport og bevislig sletning for at opfylde offentlighedslove og privatlivslovgivning, og de tenancy-garantier, I underskriver, skal være nogle, jeres arkitektur reelt kan holde.

Eksempler

Startup. Et startup på femten personer bygger sit produkt som en enkelt delt pool fra dag ét og har ret i det. Alle tenants deler én administreret Postgres-database med et tenant_id på hver tabel, row-level security håndhæver tenantprædikatet i databasen, så et glemt filter ikke kan lække, og applikationen løser tenanten fra et subdomæne ved kanten og trækker den gennem hver anmodning og hvert baggrundsjob. Onboarding er selvbetjent: en ny tilmelding provisionerer sin tenantrække, sår standarder og er live på sekunder. To ingeniører driver hele platformen, fordi der er ét system at drive. Da deres første reelle virksomhedsprospekt kræver en dedikeret database og en kontraktlig isolationsgaranti, tilføjer de et bridge-niveau: samme kodebase, men denne tenant får sin egen database på sit eget shard, solgt til en pris, der dækker omkostningen.

Stor virksomhed. En SaaS-leverandør, der betjener store finansielle institutioner, kører en niveaudelt bridge-arkitektur. Tusinder af små og mellemstore kunder bor i regionale delte puljer, shardet efter tenant, med kvoter og retfærdig planlægning, der holder de støjende naboer i skak. Topniveau-bankkunder får single-tenant-udrulninger i isolerede cloudkonti, med dedikerede databaser, nøgler pr. tenant og kontraktlige dataresidens- og isolationsgarantier skrevet ind i rammeaftalen. En platformsevne migrerer en tenant mellem niveauer uden nedetid, når de vokser, eller deres compliancebehov ændrer sig. Hver tenants omkostning tilskrives gennem tagging, så økonomien kender den sande margin på hver konto, og tenant-tagget observerbarhed lader vagthavende ingeniør på sekunder se, om en alarm er én tenant eller hele flåden.

Offentlig sektor. En national platformsudbyder hoster mange myndigheder som separate tenants og behandler isolation som et juridisk krav, ikke en præference. Dataresidenslov fastlåser hver myndigheds data til regioner i landet, håndhævet af policy-as-code, der blokerer enhver ressource i en ikke-tilladt region (kapitel 3.11). Klassifikation driver modellen: myndigheder, der håndterer følsomt materiale, får fuldt siloede udrulninger i separate konti med deres egen revisionsgrænse, mens arbejdsbyrder med lavere klassifikation deler en styret pool. Hver myndighed er sin egen tenant med sin egen identitetsintegration, sine egne opbevarings- og eksportregler og et revisionsspor afgrænset til dens grænse, så én myndigheds revisorer aldrig ser en andens aktivitet. Offboarding producerer en certificeret dataeksport og en bevislig sletning, fordi posterne er underlagt offentlighedslove og privatlivslovgivning.

Business case: motivation, ROI og TCO

Kerne-business casen for multitenancy er margin. En single-tenant-model, hvor du udruller en frisk kopi pr. kunde, betyder, at infrastruktur- og driftsomkostning vokser nogenlunde lineært med kundeantallet, og dine ingeniører bruger deres dage på at patche mange kopier. En delt multitenant-model bryder det led: du patcher én gang, skalerer ét system og pakker kunder tæt nok til, at den marginale omkostning ved næste tenant nærmer sig nul. Det er, hvad der lader en SaaS-forretning vokse omsætning langt hurtigere end omkostning, og det er derfor, investorer og bestyrelser behandler en ren multitenant-arkitektur som en indikator for et skalerbart firma.

Afkastet viser sig tre steder: driftsmæssig gearing (ét team kører hele flåden), hurtigere levering (en rettelse udrulles til alle tenants på én gang, så hastigheden ikke henfalder, efterhånden som I tilføjer kunder) og prisoptionalitet (en delt plan til den lange hale og en premium isoleret plan til virksomheder, begge fra én kodebase). Sæt disse over for de omkostninger, I ærligt må finansiere: ingeniørarbejdet til at bygge håndhævet tenantisolation, kvoter, livscyklusautomatisering og observerbarhed pr. tenant, plus disciplinen til at holde grænsen intakt. Omkostningen ved at tage fejl er asymmetrisk og alvorlig, fordi et enkelt databrud på tværs af tenants kan udløse regulatoriske bøder, massefrafald og omdømmeskade, der dværger den infrastruktur, I sparede ved at dele. Ram sagen ind over for ledelsen som margin og skalerbarhed på opsiden og eksistentiel risiko på nedsiden. Forankr serviceniveauaftalen og de kontraktlige datagarantier i den tenancy-model, I reelt kan levere, for et løfte, jeres arkitektur ikke kan holde, er et ansvar, ikke et salg.

Anti-mønstre og faldgruber

  • Tenantafgrænsning ved konvention. At stole på, at udviklere husker tenantfilteret på hver forespørgsel, uden sikkerhedsnet på databaseniveau eller i dataadgangslaget; én udeladelse er et brud.
  • At stole på en klientleveret tenantidentifikator. At acceptere tenanten fra anmodningsinput til autorisation i stedet for at udlede den fra den autentificerede identitet, hvilket lader en kalder bede om en andens data.
  • Uafgrænset baggrundsarbejde. Job, caches, webhooks og eksporter, der mister tenantkontekst, fordi nogen kun afgrænsede den synkrone anmodningssti.
  • Kodeforks pr. tenant. At lave særtilfælde for en stor kunde i kodestien, til I vedligeholder mange divergerende produkter under ét navn, og hver ændring koster ti gange så meget.
  • Intet forsvar mod støjende naboer. At køre en delt pool uden kvoter eller retfærdighed pr. tenant, så den første tenant, der spidser, tager alle ned.
  • Offboarding som en eftertanke. At bygge uden dataeksport og bevislig sletning og så fejle en kundes udtrædelsesklausul eller en privatlivsanmodning, fordi det delte skema gør udtræk smertefuldt.
  • At flyve blindt pr. tenant. Logs, målinger og omkostning uden tenantdimension, så I ikke kan se, hvis hændelse det er, eller hvilken tenant der er urentabel.

Modenhedsmodel

  • Niveau 1, Opstart: Multitenancy er improviseret og reaktiv. Tenantadskillelse hviler på håndskrevne filtre uden sikkerhedsnet, modellen er én størrelse til alle, der er ingen kvoter, onboarding er manuel, og logs og omkostning bærer ingen tenantdimension. Teamet lærer om den støjende nabo og det næsten-lækkede fra hændelser.
  • Niveau 2, Udvikling: Grundlæggende praksis dukker op, men er inkonsistent på tværs af teams. En tenancy-model er valgt, og tenantkontekst propageres gennem hovedanmodningsstien, et sikkerhedsnet på database- eller dataadgangsniveau håndhæver afgrænsning på kernetabeller, og grundlæggende kvoter pr. tenant findes. Onboarding er delvist automatiseret, og logs bærer en tenantidentifikator, men baggrundsstier, eksport og omkostningstilskrivning varierer fra tjeneste til tjeneste og er ikke skrevet ned nogen steder.
  • Niveau 3, Standardisering: Tenancy-tilgangen er dokumenteret og håndhævet i hele organisationen. Niveaudelt tenancy afbildes til prissætning, med en delt pool til små tenants og isolerede udrulninger til virksomheds- og regulerede, tenantafgrænsning håndhæves i dybden og testes med vilje, kvoter og retfærdig planlægning indgrænser støjende naboer, tenantens livscyklus inklusive eksport og bevislig sletning er automatiseret, og observerbarhed og omkostning skæres pr. tenant. Hvert team følger den samme tenancy-standard frem for sin egen.
  • Niveau 4, Styring: Tenancy-landskabet måles og styres mod baselines. Isolation, retfærdighed, latens og omkostning pr. tenant følges som målinger med aftalte mål: testdækning på tværs af tenants, rater for kvotebrud og hændelser med støjende naboer, onboarding- og offboardingtid og margin pr. tenant rapporteres mod baselines, og beslutninger om at promovere en tenant mellem niveauer eller omprissætte en urentabel træffes på det grundlag frem for ved anekdote. Residens- og klassifikationsoverensstemmelse overvåges løbende, og afvigelse fra standarden udløser en dokumenteret reaktion.
  • Niveau 5, Orkestrering: Tenancy forbedres løbende og er integreret i hele organisationen. Grænser mellem tenants udøves af rutinemæssige red team-øvelser, tenants flytter mellem niveauer uden nedetid, efterhånden som de vokser, eller deres compliancebehov ændrer sig, margin pr. tenant fodrer prissætning og kapacitetsplanlægning, og residens- og klassifikationsregler håndhæves af politik frem for af gennemgang. Modellen tilpasser sig, efterhånden som kundemixet og det regulatoriske billede skifter, og erfaringerne fodrer produkt, sikkerhed og økonomi som én løkke.

Idéer til drøftelse

  1. Hvor sidder hvert af jeres kundeniveauer på spektret mellem isolation og effektivitet i dag, og er noget niveau i den forkerte model i forhold til de garantier, I solgte, eller den margin, I har brug for?
  2. Hvis I skulle bevise over for en revisor, at tenant A ikke kan tilgå tenant B’s data, hvilken dokumentation kunne I fremlægge lige nu, og hvor meget af den er automatiseret versus påstået?
  3. Hvilke af jeres asynkrone stier (job, caches, webhooks, eksporter, søgeindekser) genetablerer tenantkontekst, og hvilke arver den blot eller stoler på kalderen?
  4. Når en tenant vokser ud af retfærdig deling, har I så en understøttet, prissat promoveringssti til en bridge- eller dedikeret udrulning, eller ender svaret som standard i en hændelse?
  5. Kan I tilskrive infrastrukturomkostning til individuelle tenants godt nok til at nævne jeres mindst rentable kunde, og ville det ændre, hvordan I prissætter?
  6. Kan I for en offentlig eller reguleret tenant håndhæve dataresidens og klassifikationsdrevet isolation ved politik og offboarde med en certificeret eksport og bevislig sletning?

Vigtigste pointer

  • Multitenancy, én instans der betjener mange tenants, er SaaS’ økonomiske motor: den driver dine marginer, og den sætter isolation på tværs af tenants i centrum af din arkitektur.
  • Behandl isolation versus effektivitet som et spektrum og del det i niveauer: pak små tenants i en effektiv delt pool, isolér store og regulerede tenants i bridge- eller silo-udrulninger, de vil betale for.
  • Lad aldrig tenantafgrænsning hvile på et håndskrevet filter; håndhæv den i dybden med row-level security eller et dataadgangslag, og test grænsen med vilje.
  • Propagér tenantkontekst gennem hver anmodning, hvert job, hver cache og hver log, og forsvar de asynkrone stier, hvor læk gemmer sig.
  • Indgræns støjende naboer med kvoter, hastighedsgrænser og retfærdig planlægning pr. tenant, og promovér tenants, der vokser ud af poolen, frem for at lade dem forringe den.
  • Bøj produktet med konfiguration pr. tenant, ikke kode pr. tenant, og gør tenantens livscyklus samt observerbarhed og omkostningstilskrivning pr. tenant til førsteklasses.

Referencer og videre læsning

  • Tom Kwok, Thao Nguyen, and Linh Lam, A Software as a Service with Multi-tenancy Support for an Electronic Contract Management Application (IEEE International Conference on Services Computing)
  • Frederick Chong and Gianpaolo Carraro, Architecture Strategies for Catching the Long Tail (Microsoft)
  • Amazon Web Services, SaaS Lens, AWS Well-Architected Framework and SaaS Tenant Isolation Strategies
  • Microsoft, Multitenant SaaS architecture and patterns (Azure Architecture Centre)
  • Google Cloud, Architecture for Multi-tenant SaaS Applications
  • Cor-Paul Bezemer and Andy Zaidman, Multi-Tenant SaaS Applications: Maintenance Dream or Nightmare? (Proceedings of the Joint ERCIM Workshop on Software Evolution)
  • The Open Web Application Security Project, OWASP Application Security Verification Standard (access-control and multi-tenancy requirements)
  • Martin Kleppmann, Designing Data-Intensive Applications (partitioning, sharding, and data isolation)