Skapa separata serverdelstjänster som ska förbrukas av specifika program eller gränssnitt i klientdelen. Det här mönstret är användbart när du vill undvika att behöva anpassa en enda serverdel för flera gränssnitt. Det här mönstret beskrevs först av Sam Newman.
Kontext och problem
Ett program kan ursprungligen vara riktat mot ett webbanvändargränssnitt på en stationär dator. Normalt utvecklas parallellt en serverdelstjänst som tillhandahåller de funktioner som behövs för användargränssnittet. När programmets användarbas växer utvecklat en mobilapp som måste interagera med samma serverdel. Serverdelstjänsten blir en generell serverdel som tillgodoser kraven för både stationära datorer och mobilgränssnitt.
Men funktionerna i en mobil enhet skiljer sig avsevärt från en skrivbordswebbläsare när det gäller skärmstorlek, prestanda och visningsbegränsningar. Kraven för en mobilapps serverdel skiljer sig därför från webbgränssnittet för en skrivbordsdator.
Dessa skillnader resulterar i skilda krav på serverdelen. Serverdelen kräver regelbundna och betydande ändringar för att fungera för både skrivbordsdatorns webbgränssnitt och mobilappen. Ofta arbetar separata gränssnittsteam på varje klientdel, vilket gör att serverdelen blir en flaskhals i utvecklingsprocessen. Motstridiga krav och behovet av att hålla tjänsten fungerande för båda klienterna kan resultera i att du lägger ned mycket arbete på en enskild distribuerbar resurs.
När utvecklingen fokuserar på serverdelstjänsten, kan du skapa ett separat team för att hantera och underhålla serverdelen. Till slut resulterar detta i att gränssnittets och serverdelens utvecklingsgrupper förlorar kontakten, vilket är en belastning för serverdelsteamet när de måste balansera de konkurrerande kraven från de olika gränssnittsteamen. När ett gränssnittsteam kräver ändringar i serverdelen, måste ändringarna verifieras med andra gränssnittsteam innan de kan integreras i serverdelen.
Lösning
Skapa en serverdel per gränssnitt. Finjustera beteendet och prestandan för varje serverdel så att de bäst matchar behoven i klientdelsmiljön, utan att behöva oroa dig för att påverka andra klientdelsupplevelser.
Eftersom varje serverdel är specifik för ett gränssnitt, kan den optimeras för det gränssnittet. Därför blir den mindre, mindre komplex och förmodligen snabbare än en gemensam serverdel som används för att uppfylla kraven för alla gränssnitt. Varje gränssnittsteam har självständigt ansvar för sin egen serverdel och förlitar sig inte på ett centralt utvecklingsteam för serverdelen. Detta ger gränssnittsteamet flexibilitet i val av språk, versionstakt, prioritering av arbetsbelastning och funktionsintegrering i sin serverdel.
Mer information finns i Mönster: serverdelar för klienter.
Problem och överväganden
- Överväg hur många serverdelar du ska distribuera.
- Om olika gränssnitt (till exempel mobilklienter) gör samma begäranden, bör du fundera över om det är nödvändigt att implementera en serverdel för varje gränssnitt, eller om en enda serverdel räcker.
- Koddubblering för olika tjänster är mycket sannolikt när du implementerar det här mönstret.
- Klientfokuserade servertjänster får endast innehålla klientspecifik logik och klientspecifikt beteende. Allmän affärslogik och andra globala funktioner bör hanteras någon annanstans i ditt program.
- Tänk på hur det här mönstret kan återspeglas i ansvaret för ett utvecklingsteam.
- Överväg hur lång tid det tar att implementera det här mönstret. Kommer arbetet med att skapa nya serverdelar dra på sig tekniska skulder, samtidigt som du fortsätter att stödja den befintliga allmänna serverdelen?
När du ska använda det här mönstret
Använd det här mönstret i sådana här scenarier:
- En delad eller allmänna serverdelstjänst måste underhållas med betydande utvecklingskostnader.
- Du vill optimera serverdelen för krav från specifika klientgränssnitt.
- En generell serverdel anpassas för att den ska kunna klara flera gränssnitt.
- Ett programmeringsspråk passar bättre för serverdelen i ett specifikt användargränssnitt, men inte alla användargränssnitt.
Det här mönstret kanske inte lämpar sig:
- När gränssnitt gör samma eller liknande begäranden till serverdelen.
- När endast ett gränssnitt används för att interagera med serverdelen.
Design av arbetsbelastning
En arkitekt bör utvärdera hur mönstret Backends for Frontends kan användas i arbetsbelastningens design för att uppfylla de mål och principer som beskrivs i grundpelarna i Azure Well-Architected Framework. Till exempel:
Grundpelare | Så här stöder det här mönstret pelarmål |
---|---|
Beslut om tillförlitlighetsdesign hjälper din arbetsbelastning att bli motståndskraftig mot fel och se till att den återställs till ett fullt fungerande tillstånd när ett fel inträffar. | Att ha separata tjänster som är exklusiva för ett specifikt klientdelsgränssnitt innehåller fel så att tillgängligheten för en klient kanske inte påverkar tillgängligheten för en annan klients åtkomst. När du behandlar olika klienter på olika sätt kan du också prioritera tillförlitlighetsarbetet baserat på förväntade klientåtkomstmönster. - RE:02 Kritiska flöden - RE:07 Självbevarande |
Beslut om säkerhetsdesign bidrar till att säkerställa konfidentialitet, integritet och tillgänglighet för arbetsbelastningens data och system. | På grund av tjänstavgränsning som introduceras i det här mönstret kan säkerhet och auktorisering i tjänstskiktet som stöder en klient skräddarsys efter de funktioner som krävs av klienten, vilket kan minska ytan på ett API och lateral rörelse mellan olika serverdelar som kan exponera olika funktioner. - SE:04 Segmentering - SE:08 Härdningsresurser |
Prestandaeffektivitet hjälper din arbetsbelastning att effektivt uppfylla kraven genom optimeringar inom skalning, data och kod. | Med serverdelsavgränsningen kan du optimera på ett sätt som kanske inte är möjligt med ett delat tjänstlager. När du hanterar enskilda klienter på olika sätt kan du optimera prestanda för en specifik klients begränsningar och funktioner. - PE:02 Kapacitetsplanering - PE:09 Kritiska flöden |
Som med alla designbeslut bör du överväga eventuella kompromisser mot målen för de andra pelarna som kan införas med det här mönstret.