Distribuera komponenter i ett program i en separat process eller container för att ge isolering och inkapsling. Det här mönstret kan även göra det möjligt för program att bestå av heterogena komponenter och tekniker.
Det här mönstret kallas sidovagn eftersom det liknar den sidvagn som kan sättas på en motorcykel. I mönstret är sidovagnen ansluten till ett överordnat program och ger stödfunktioner för programmet. Sidovagnen delar även samma livscykel som det överordnade programmet, och skapas och dras tillbaka tillsammans med det överordnade programmet. Sidovagnsmönstret kallas ibland sidekick-mönster och är ett dekompositionsmönster.
Kontext och problem
Program och tjänster kräver ofta relaterade funktioner, t.ex. övervakning, loggning, konfiguration och nätverkstjänster. Dessa kringuppgifter kan implementeras som olika komponenter eller tjänster.
Om de är tätt integrerade i programmet kan de köras i samma process som programmet, vilket effektivt använder delade resurser. Det innebär dock också att de inte är väl isolerade, och ett avbrott i någon av dessa komponenter kan påverka andra komponenter eller hela programmet. Dessutom måste de vanligtvis implementeras med samma språk som det överordnade programmet. Därför har komponenten och programmet ett nära ömsesidigt beroende av varandra.
Om programmet delas upp i tjänster kan sedan varje tjänst byggas med olika språk och tekniker. Även om detta ger bättre flexibilitet innebär det att varje komponent har sina egna beroenden och kräver språkspecifika bibliotek för åtkomst till den underliggande plattformen och eventuella resurser som delas med det överordnade programmet. Dessutom kan svarstiden för programmet bli längre om man distribuerar dessa funktioner som separata tjänster. Hantering av koden och beroenden för dessa språkspecifika gränssnitt kan också ge ytterligare komplexitet, särskilt för värdresurser, distribution och hantering.
Lösning
Samordna en sammanhängande uppsättning uppgifter med det primära programmet, men placera dem i egna processer eller containrar, vilket ger ett enhetligt gränssnitt för plattformstjänster över olika språk.
En sidovagnstjänst är inte nödvändigtvis en del av programmet, men den är ansluten till den. Den följer med överallt dit det överordnade programmet går. Sidovagnar stöder processer eller tjänster som distribueras med det primära programmet. På en motorcykel är sidovagnen kopplad till en motorcykel, och varje motorcykel kan ha en egen sidovagn. På samma sätt delar sidovagnstjänsten det överordnade programmets öde. För varje instans av programmet distribueras en instans av sidovagnen och hostas bredvid det.
Fördelarna med att använda ett sidovagnsmönster är bland annat:
En sidovagn är oberoende av det primära programmet när det gäller körningsmiljö och programmeringsspråk, så du behöver inte utveckla en sidovagn per språk.
Sidovagnen har åtkomst till samma resurser som det primära programmet. Sidovagnen kan till exempel övervaka systemresurser som används av både sidovagnen och det primära programmet.
På grund av dess närhet till det primära programmet finns det ingen betydande svarstid när du kommunicerar mellan dem.
Även för program som inte tillhandahåller en utökningsmekanism kan du använda en sidovagn för att utöka funktionaliteten genom att koppla den som en egen process i samma värd eller undercontainer som det primära programmet.
Sidovagnsmönstret används ofta med containrar och kallas för en sidovagnscontainer eller sidekick-container.
Problem och överväganden
- Fundera över vilket distributions- och förpackningsformat du ska använda för att distribuera tjänster, processer eller containrar. Containrar är särskilt väl lämpade för sidovagnsmönstret.
- När du utformar en sidovagnstjänst måste du noga överväga kommunikationsmekanismen mellan processer. Försök använda språk- eller ramverksoberoende tekniker om inte prestandakrav gör det opraktiskt.
- Innan du lägger in funktioner i en sidovagn bör du överväga om det skulle fungera bättre som en separat tjänst eller en mer traditionell daemon.
- Fundera även över om funktionen kan implementeras som ett bibliotek eller med en traditionell tilläggsmekanism. Språkspecifika bibliotek kan ha en mer djupgående integreringsnivå och mindre nätverksadministration.
När du ska använda det här mönstret
Använd det här mönstret i sådana här scenarier:
- Ditt primära program använder en heterogen uppsättning språk och ramverk. En komponent som finns i en sidovagnstjänst kan användas av program som skrivits i olika språk med olika ramverk.
- En komponent ägs av ett fjärranslutet team eller en annan organisation.
- En komponent eller funktion måste finnas på samma värd som programmet.
- Du behöver en tjänst som delar huvudprogrammets övergripande livscykel, men kan uppdateras oberoende.
- Du behöver detaljerad kontroll över resursgränser för en viss resurs eller komponent. Du kanske vill begränsa mängden minne som en viss komponent använder. Du kan distribuera komponenten som en sidovagn och hantera minnesanvändning oberoende av det huvudsakliga programmet.
Det här mönstret kanske inte lämpar sig:
- När kommunikation mellan processer måste optimeras. Kommunikation mellan ett överordnat program och sidovagnstjänster omfattar vissa omkostnader, särskilt svarstid i anropen. Det kanske inte är en godtagbar kompromiss vid gränssnitt med hög kommunikation.
- Vid små program där resurskostnaden för att distribuera en sidovagnstjänst för varje instans inte är värd fördelen med isolering.
- När tjänsten behöver skalas annorlunda än eller oberoende av de huvudsakliga programmen. I så fall kan det vara bättre att distribuera funktionen som en separat tjänst.
Design av arbetsbelastning
En arkitekt bör utvärdera hur sidecar-mönstret 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 säkerhetsdesign bidrar till att säkerställa konfidentialitet, integritet och tillgänglighet för arbetsbelastningens data och system. | Genom att kapsla in den här uppgiften och distribuera dem ur processen kan du minska ytan för känsliga processer till endast den kod som behövs för att utföra uppgiften. Du kan också använda sidovagn för att lägga till övergripande säkerhetskontroller i en programkomponent som inte är inbyggt utformad med den funktionen. - SE:04 Segmentering - SE:07-kryptering |
Operational Excellence hjälper till att leverera arbetsbelastningskvalitet genom standardiserade processer och teamsammanhållning. | Det här mönstret ger en metod för att implementera flexibilitet i verktygsintegrering som kan förbättra programmets observerbarhet utan att programmet behöver ta direkta implementeringsberoenden. Det gör att sidovagnsfunktionerna kan utvecklas oberoende av varandra och underhållas oberoende av programmets livscykel. - OE:04 Verktyg och processer - OE:07 Övervakningssystem |
Prestandaeffektivitet hjälper din arbetsbelastning att effektivt uppfylla kraven genom optimeringar inom skalning, data och kod. | Du kan flytta övergripande uppgifter till en enda process som kan skalas över flera instanser av huvudprocessen, vilket minskar behovet av att distribuera duplicerade funktioner för varje instans av programmet. - PE:07 Kod och infrastruktur |
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.
Exempel
Sidovagnsmönstret är tillämpligt för många scenarier. Några vanliga exempel:
- Infrastruktur-API. Utvecklingsteamet för infrastruktur skapar en tjänst som distribueras tillsammans med varje program, i stället för ett språkspecifikt klientbibliotek för att komma åt infrastrukturen. Tjänsten läses in som en sidovagn och ger ett gemensamt lager för infrastrukturtjänster, inklusive loggning, miljödata, konfigurationslager, identifiering, hälsokontroller och watchdog-tjänster. Sidovagnen övervakar även det överordnade programmets värdmiljö och process (eller container) och loggar informationen till en central tjänst.
- Hantera NGINX/HAProxy. Distribuera NGINX med en sidovagnstjänst som övervakar miljötillståndet och sedan uppdaterar NGINX-konfigurationsfilen och återanvänder processen när en ändring av tillstånd krävs.
- Ambassadörsidovagn. Distribuera en ambassadör-tjänst som sidvagn. Programmet anropar via ambassadören, som hanterar loggning av begäran, routning, kretsbrytning och andra anslutningsrelaterade funktioner.
- Avlastningsproxy. Placera en NGINX-proxy framför en node.js-tjänstinstans för att hantera betjäning av statiskt filinnehåll för tjänsten.