Oldalkocsi mintaSidecar pattern

Egy alkalmazás összetevőit külön folyamatban vagy tárolóban helyezheti üzembe, így elkülönítést és beágyazást biztosíthat.Deploy components of an application into a separate process or container to provide isolation and encapsulation. Ez a minta azt is lehetővé teheti, hogy az alkalmazások heterogén összetevőkből és technológiákból álljanak.This pattern can also enable applications to be composed of heterogeneous components and technologies.

Ezt a mintát Oldalkocsi mintának nevezik, mert egy motorhoz csatolt oldalkocsihoz hasonlít.This pattern is named Sidecar because it resembles a sidecar attached to a motorcycle. A mintában az oldalkocsi egy szülőalkalmazáshoz van csatolva, és támogató szolgáltatásokat biztosít az alkalmazásnak.In the pattern, the sidecar is attached to a parent application and provides supporting features for the application. Az oldalkocsi ugyanakkora élettartammal rendelkezik, mint a szülőalkalmazás, együtt jönnek létre, és együtt vonhatók ki.The sidecar also shares the same lifecycle as the parent application, being created and retired alongside the parent. Az oldalkocsi minta egy felbontási minta, amelyet segítőtárs mintának is neveznek.The sidecar pattern is sometimes referred to as the sidekick pattern and is a decomposition pattern.

Kontextus és problémaContext and Problem

Az alkalmazások és szolgáltatások gyakran megkövetelnek kapcsolódó funkciókat, például monitorozást, naplózást, konfigurálást és hálózati szolgáltatásokat.Applications and services often require related functionality, such as monitoring, logging, configuration, and networking services. Ezek a perifériafeladatok különálló összetevőkként vagy szolgáltatásokként is megvalósíthatók.These peripheral tasks can be implemented as separate components or services.

Ha szorosan integráltak az alkalmazásba, futtathatók ugyanabban a folyamatban, mint az alkalmazás, így biztosítható a megosztott erőforrások hatékony használata.If they are tightly integrated into the application, they can run in the same process as the application, making efficient use of shared resources. Ez azonban azt is jelenti, hogy nem jól elkülönítettek, ezért egy kimaradás az összetevők egyikében hatással lehet a többi összetevőre vagy az egész alkalmazásra is.However, this also means they are not well isolated, and an outage in one of these components can affect other components or the entire application. Továbbá ugyanannak a nyelvnek a használatával kell megvalósítani őket, mint amelyet a szülőalkalmazás használ.Also, they usually need to be implemented using the same language as the parent application. Ennek eredményeképpen az összetevő és az alkalmazás erősen függ egymástól.As a result, the component and the application have close interdependence on each other.

Ha az alkalmazás szolgáltatásokra van bontva, akkor minden egyes szolgáltatás felépíthető több különböző nyelv és technológia használatával.If the application is decomposed into services, then each service can be built using different languages and technologies. Míg ez nagyobb rugalmasságot biztosít, azt is jelenti, hogy minden összetevőnek vannak saját függőségei, és nyelvspecifikus kódtárakra van szükségük az alapul szolgáló platform és a szülőalkalmazással megosztott erőforrások eléréséhez.While this gives more flexibility, it means that each component has its own dependencies and requires language-specific libraries to access the underlying platform and any resources shared with the parent application. Továbbá ezeknek a tulajdonságoknak a különálló szolgáltatásként való telepítése késleltetést okozhat az alkalmazásban.In addition, deploying these features as separate services can add latency to the application. A nyelvspecifikus felületek kódjainak és függőségeinek a kezelése nagyobb összetettséget eredményezhet, különösen az üzemeltetésnél, az üzembe helyezésnél és a kezelésnél.Managing the code and dependencies for these language-specific interfaces can also add considerable complexity, especially for hosting, deployment, and management.

MegoldásSolution

Helyezzen egy kohézióval jellemezhető feladatcsoportot arra a helyre, ahol a főalkalmazás is található, de a feladatcsoportot külön folyamatba vagy tárolóba helyezze, hogy minden nyelven egységes felületet hozzon létre a platformszolgáltatásoknak.Co-locate a cohesive set of tasks with the primary application, but place them inside their own process or container, providing a homogeneous interface for platform services across languages.

Az oldalkocsi mintájának ábrája

Egy oldalkocsi szolgáltatás nem feltétlenül az alkalmazás része, de kapcsolódik hozzá.A sidecar service is not necessarily part of the application, but is connected to it. Mindenhová követi a szülőalkalmazást.It goes wherever the parent application goes. Az oldalkocsik olyan folyamatokat és szolgáltatásokat támogatnak, amelyek az elsődleges alkalmazással lettek üzembe helyezve.Sidecars are supporting processes or services that are deployed with the primary application. A motorkerékpárok esetében az oldalkocsi egy motorkerékpárhoz csatlakozik, és minden motorkerékpárnak lehet saját oldalkocsija.On a motorcycle, the sidecar is attached to one motorcycle, and each motorcycle can have its own sidecar. Ehhez hasonlóan egy oldalkocsi szolgáltatás is követi a szülőalkalmazását.In the same way, a sidecar service shares the fate of its parent application. Az alkalmazás minden egyes példányához kapcsolódik egy telepített oldalkocsi példány, amely vele együtt fut.For each instance of the application, an instance of the sidecar is deployed and hosted alongside it.

Az oldalkocsi minta használatának előnyei:Advantages of using a sidecar pattern include:

  • Az oldalkocsi független az elsődleges alkalmazásától, ami a futtatókörnyezetet és a programozási nyelvet illeti, így nem kell nyelvenként külön oldalkocsit fejleszteni.A sidecar is independent from its primary application in terms of runtime environment and programming language, so you don't need to develop one sidecar per language.

  • Az oldalkocsi hozzáférhet ugyanazokhoz az erőforrásokhoz, amelyekhez az elsődleges alkalmazás is hozzáfér.The sidecar can access the same resources as the primary application. Az oldalkocsi például monitorozhatja mind az oldalkocsi, mind az elsődleges alkalmazás által használt rendszer-erőforrásokat.For example, a sidecar can monitor system resources used by both the sidecar and the primary application.

  • Mivel közel helyezkedik el az elsődleges alkalmazáshoz, nincs jelentős késleltetés a közöttük zajló kommunikáció során.Because of its proximity to the primary application, there’s no significant latency when communicating between them.

  • Még olyan alkalmazások esetében is, amelyek nem biztosítanak bővíthetőségi mechanizmust, az oldalkocsi használatával kiterjesztheti a funkcionalitást úgy, hogy saját folyamatként csatolja ugyanazon a gazdagépen vagy altárolóban, mint az elsődleges alkalmazás.Even for applications that don’t provide an extensibility mechanism, you can use a sidecar to extend functionality by attaching it as its own process in the same host or sub-container as the primary application.

Az oldalkocsi mintát gyakran használják tárolókhoz is, amely esetben oldalkocsi tároló vagy segítőtárs tároló jön létre.The sidecar pattern is often used with containers and referred to as a sidecar container or sidekick container.

Problémák és megfontolandó szempontokIssues and Considerations

  • Gondolja át, milyen üzembe helyezési és csomagolási formátumot használ a szolgáltatások, folyamatok és tárolók telepítéséhez.Consider the deployment and packaging format you will use to deploy services, processes, or containers. A tárolók kiválóan alkalmasak az oldalkocsi minta használatához.Containers are particularly well suited to the sidecar pattern.
  • Egy oldalkocsi szolgáltatás tervezésekor alaposan gondolja át, milyen folyamatok közötti kommunikációs mechanizmus mellett dönt.When designing a sidecar service, carefully decide on the interprocess communication mechanism. Próbáljon nyelvtől vagy keretrendszertől független technológiákat használni, kivéve, ha a teljesítményre vonatkozó követelmények ezt problémássá teszik.Try to use language- or framework-agnostic technologies unless performance requirements make that impractical.
  • Mielőtt funkciókat rendel az oldalkocsihoz, gondolja át, hogy önálló szolgáltatásként vagy démonként nem működne-e jobban.Before putting functionality into a sidecar, consider whether it would work better as a separate service or a more traditional daemon.
  • Vegye figyelembe azt is, hogy a funkció kódtárként vagy egy hagyományos bővítménymechanizmussal is megvalósítható.Also consider whether the functionality could be implemented as a library or using a traditional extension mechanism. Előfordulhat, hogy a nyelvspecifikus kódtárak mélyebb szintű integrációval és kisebb hálózati terheléssel rendelkeznek.Language-specific libraries may have a deeper level of integration and less network overhead.

Mikor érdemes ezt a mintát használni?When to Use this Pattern

Használja ezt a mintát, ha:Use this pattern when:

  • Az elsődleges alkalmazás a nyelvek és keretrendszerek heterogén készletét használja.Your primary application uses a heterogeneous set of languages and frameworks. Egy oldalkocsi szolgáltatásban található összetevőt különféle nyelveken írott és különféle keretrendszereket használó alkalmazások is felhasználhatnak.A component located in a sidecar service can be consumed by applications written in different languages using different frameworks.
  • Egy összetevő egy távoli csapat vagy egy másik vállalat tulajdonában van.A component is owned by a remote team or a different organization.
  • Egy összetevőt vagy szolgáltatást ugyanazon a gazdagépen kell elhelyezni, mint az alkalmazást.A component or feature must be co-located on the same host as the application
  • Egy olyan szolgáltatásra van szüksége, amely ugyanakkora életciklussal rendelkezik, mint a főalkalmazása, de egymástól függetlenül frissíthetők.You need a service that shares the overall lifecycle of your main application, but can be independently updated.
  • Egy erőforrás vagy összetevő erőforrás-korlátozásait részletesen kívánja szabályozni.You need fine-grained control over resource limits for a particular resource or component. Előfordulhat például, hogy korlátozni szeretné a megadott összetevő által használt memória mennyiségét.For example, you may want to restrict the amount of memory a specific component uses. Az összetevőt telepítheti oldalkocsiként, és a főalkalmazástól függetlenül kezelheti a memóriahasználatot.You can deploy the component as a sidecar and manage memory usage independently of the main application.

Nem érdemes ezt a mintát használni, ha:This pattern may not be suitable:

  • Ha optimalizálni kívánja a folyamatok közötti kommunikációt.When interprocess communication needs to be optimized. A szülőalkalmazás és az oldalkocsi közötti kommunikáció némi többletterhelést okoz, amely leginkább a hívásokat érintő késésekben nyilvánul meg.Communication between a parent application and sidecar services includes some overhead, notably latency in the calls. Ez nem minden esetben fogadható el kompromisszumként a forgalmas felületek esetében.This may not be an acceptable trade-off for chatty interfaces.
  • Kisebb alkalmazásoknál, ahol annak az erőforrásköltsége, hogy minden példányhoz egy oldalkocsi szolgáltatás legyen üzembe helyezve, túlságosan magas az elkülönítés előnyeihez viszonyítva.For small applications where the resource cost of deploying a sidecar service for each instance is not worth the advantage of isolation.
  • Ha a szolgáltatást a főalkalmazásoktól eltérően, vagy azoktól függetlenül kell skálázni.When the service needs to scale differently than or independently from the main applications. Ebben az esetben jobb megoldás lehet különálló szolgáltatásként üzembe helyezni.If so, it may be better to deploy the feature as a separate service.

PéldaExample

Az oldalkocsi minta számos forgatókönyv esetén alkalmazható.The sidecar pattern is applicable to many scenarios. Gyakori példák:Some common examples:

  • Infrastruktúra-API.Infrastructure API. Az infrastruktúra-fejlesztő csapat egy olyan szolgáltatást hoz létre, amelyet a rendszer minden alkalmazás mellé telepít, nem pedig egy nyelvspecifikus ügyfélkódtárat, amellyel elérhető az infrastruktúra.The infrastructure development team creates a service that's deployed alongside each application, instead of a language-specific client library to access the infrastructure. A szolgáltatás egy oldalkocsiként van betöltve, és egy közös réteget biztosít az infrastruktúra-szolgáltatásoknak, beleértve a naplózást, a környezeti adatokat, a konfigurációs adattárakat, a felderítést, az állapot-ellenőrzéseket és a figyelő szolgáltatásokat.The service is loaded as a sidecar and provides a common layer for infrastructure services, including logging, environment data, configuration store, discovery, health checks, and watchdog services. Az oldalkocsi a szülőalkalmazás gazdagép-környezetét és folyamatát (vagy tárolóját) is monitorozza, és naplózza az adatokat egy központosított szolgáltatásba.The sidecar also monitors the parent application's host environment and process (or container) and logs the information to a centralized service.
  • NGINX/HAproxy felügyelete.Manage NGINX/HAProxy. Telepítse az NGINX-et egy olyan oldalkocsi szolgáltatással, amely a környezet állapotát monitorozza, majd frissíti az NGINX konfigurációs fájlját és újraindítja a folyamatot, ha állapotmódosításra van szükség.Deploy NGINX with a sidecar service that monitors environment state, then updates the NGINX configuration file and recycles the process when a change in state is needed.
  • Nagykövet oldalkocsi.Ambassador sidecar. Telepítsen egy nagykövet szolgáltatást oldalkocsiként.Deploy an ambassador service as a sidecar. Az alkalmazás meghívja a nagykövetet, amely a bejelentkezéseket, az útválasztást, az áramköri megszakítást és az egyéb, csatlakozáshoz kapcsolódó szolgáltatásokat kezeli.The application calls through the ambassador, which handles request logging, routing, circuit breaking, and other connectivity related features.
  • Proxykiszervezés.Offload proxy. Helyezzen egy NGINX-proxyt egy node.js szolgáltatáspéldány elé a szolgáltatás statikusfájl-tartalmai kiszolgálásának kezeléséhez.Place an NGINX proxy in front of a node.js service instance, to handle serving static file content for the service.