Wzorzec przyczepkiSidecar pattern

Wdrażanie składników aplikacji w osobnym procesie lub kontenerze w celu zapewnienia izolacji i hermetyzacji.Deploy components of an application into a separate process or container to provide isolation and encapsulation. Ten wzorzec może również umożliwić, aby aplikacje składały się ze składników i technologii heterogenicznych.This pattern can also enable applications to be composed of heterogeneous components and technologies.

Ten wzorzec jest nazywany Przyczepką, ponieważ jest podobny do przyczepki dołączanej do motocykla.This pattern is named Sidecar because it resembles a sidecar attached to a motorcycle. We wzorcu przyczepka jest dołączona do aplikacji nadrzędnej i udostępnia funkcje pomocnicze dla aplikacji.In the pattern, the sidecar is attached to a parent application and provides supporting features for the application. Przyczepki dotyczy też ten sam cykl życia, co aplikacji nadrzędnej, ponieważ jest tworzona i wycofywana wraz z elementem nadrzędnym.The sidecar also shares the same lifecycle as the parent application, being created and retired alongside the parent. Wzorzec przyczepki czasami jest nazywany wzorcem pomocnika i jest to wzorzec dekompozycji.The sidecar pattern is sometimes referred to as the sidekick pattern and is a decomposition pattern.

Kontekst i problemContext and Problem

Aplikacje i usługi często wymagają powiązanych funkcji, takich jak monitorowanie, rejestrowanie, konfigurowanie i usługi sieciowe.Applications and services often require related functionality, such as monitoring, logging, configuration, and networking services. Te zadania peryferyjne można zaimplementować jako osobne składniki lub usługi.These peripheral tasks can be implemented as separate components or services.

Jeśli są one ściśle zintegrowane w aplikacji, mogą działać w tym samym procesie co aplikacja, efektywnie wykorzystując udostępnione zasoby.If they are tightly integrated into the application, they can run in the same process as the application, making efficient use of shared resources. Jednak oznacza to również, że nie są one dobrze izolowane i awaria w jednym z tych składników może mieć wpływ na inne składniki lub całą aplikację.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. Ponadto zwykle muszą być implementowane przy użyciu tego samego języka co aplikacja nadrzędna.Also, they usually need to be implemented using the same language as the parent application. W efekcie składnik i aplikacja są ściśle wzajemnie zależne od siebie.As a result, the component and the application have close interdependence on each other.

Jeśli aplikacja zostanie podzielona na usługi, każda usługa może wówczas zostać utworzona za pomocą innego języka i technologii.If the application is decomposed into services, then each service can be built using different languages and technologies. Chociaż daje to większą elastyczność, oznacza to, że każdy składnik ma swoje własne zależności i wymaga charakterystycznych dla języka bibliotek, aby uzyskać dostęp do podstawowej platformy i wszelkich zasobów współdzielonych z aplikacją nadrzędną.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. Ponadto wdrożenie tych funkcji jako oddzielnych usług może wprowadzić opóźnienie do aplikacji.In addition, deploying these features as separate services can add latency to the application. Zarządzanie kodem i zależnościami dla tych interfejsów specyficznych dla języka mogą również znacznie zwiększyć złożoność, szczególnie w przypadku hostingu, wdrażania i zarządzania.Managing the code and dependencies for these language-specific interfaces can also add considerable complexity, especially for hosting, deployment, and management.

RozwiązanieSolution

Kolokuj spójny zestaw zadań z podstawową aplikacją, ale umieść je wewnątrz własnego procesu lub kontenera, udostępniając jednorodny interfejs dla usług platformy w różnych językach.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.

Diagram wzorca przyczepki

Usługa przyczepki niekoniecznie jest częścią aplikacji, ale jest z nią połączona.A sidecar service is not necessarily part of the application, but is connected to it. Przechodzi ona wszędzie tam, gdzie przejdzie aplikacja nadrzędna.It goes wherever the parent application goes. Przyczepki obsługują procesy lub usługi, które zostały wdrożone wraz z główną aplikacją.Sidecars are supporting processes or services that are deployed with the primary application. W motocyklu przyczepka jest dołączona do jednego motocykla i każdy motocykl może mieć własną przyczepkę.On a motorcycle, the sidecar is attached to one motorcycle, and each motorcycle can have its own sidecar. W ten sam sposób usługa przyczepki dzieli swój los z aplikacją nadrzędną.In the same way, a sidecar service shares the fate of its parent application. Dla każdego wystąpienia aplikacji wystąpienie przyczepki jest wdrażane i hostowane obok niej.For each instance of the application, an instance of the sidecar is deployed and hosted alongside it.

Do zalet używania wzorca przyczepki należą:Advantages of using a sidecar pattern include:

  • Przyczepka jest niezależna od swojej głównej aplikacji w sensie środowiska uruchomieniowego i języka programowania, dzięki czemu nie musisz opracowywać jednej przyczepki dla każdego języka.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.

  • Przyczepka może mieć dostęp do tych samych zasobów co główna aplikacja.The sidecar can access the same resources as the primary application. Na przykład przyczepka może monitorować zasoby systemowe używane zarówno przez przyczepkę, jak i główną aplikację.For example, a sidecar can monitor system resources used by both the sidecar and the primary application.

  • Ze względu na swoją bliskość z główną aplikacją nie występują istotne opóźnienia podczas komunikacji między nimi.Because of its proximity to the primary application, there’s no significant latency when communicating between them.

  • Nawet w przypadku aplikacji, które nie zapewniają mechanizmu rozszerzalności, można użyć przyczepki do rozszerzenia funkcjonalności, dołączając ją jako własny proces na tym samym hoście lub podkontenerze co aplikacja podstawowa.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.

Wzorzec przyczepki jest często używany z kontenerami i nazywany kontenerem przyczepki lub kontenerem pomocnika.The sidecar pattern is often used with containers and referred to as a sidecar container or sidekick container.

Problemy i zagadnieniaIssues and Considerations

  • Rozważ wdrożenie i format pakowania, który będzie używany do wdrażania usług, procesów lub kontenerów.Consider the deployment and packaging format you will use to deploy services, processes, or containers. Kontenery szczególnie dobrze nadają się na wzorzec przyczepki.Containers are particularly well suited to the sidecar pattern.
  • Podczas projektowania usługi przyczepki należy ostrożnie podejmować decyzje o mechanizmie komunikacji międzyprocesowej.When designing a sidecar service, carefully decide on the interprocess communication mechanism. Spróbuj użyć technologii niezależnych od języka lub struktury, chyba że wymagania dotyczące wydajności spowodują, że będzie to niepraktyczne.Try to use language- or framework-agnostic technologies unless performance requirements make that impractical.
  • Przed umieszczeniem funkcji w przyczepce należy wziąć pod uwagę, czy działałyby lepiej jako osobna usługa lub bardziej tradycyjny demon.Before putting functionality into a sidecar, consider whether it would work better as a separate service or a more traditional daemon.
  • Należy również wziąć pod uwagę to, czy funkcje można zaimplementować jako bibliotekę lub przy użyciu tradycyjnego mechanizmu rozszerzenia.Also consider whether the functionality could be implemented as a library or using a traditional extension mechanism. Biblioteki charakterystyczne dla języka mogą mieć większy poziom integracji i mniejsze obciążenie sieci.Language-specific libraries may have a deeper level of integration and less network overhead.

Kiedy należy używać tego wzorcaWhen to Use this Pattern

Użyj tego wzorca, gdy:Use this pattern when:

  • Aplikacja podstawowa używa niejednorodnego zestawu języków i struktur.Your primary application uses a heterogeneous set of languages and frameworks. Składnik znajdujący się w usłudze przyczepki może być używany przez aplikacje napisane w różnych językach za pomocą różnych struktur.A component located in a sidecar service can be consumed by applications written in different languages using different frameworks.
  • Składnik jest własnością zdalnego zespołu lub innej organizacji.A component is owned by a remote team or a different organization.
  • Składnik lub funkcja muszą być kolokowane na tym samym hoście co aplikacjaA component or feature must be co-located on the same host as the application
  • Potrzebna jest usługa, która współużytkuje ogólny cykl życia aplikacji głównej, ale można ją niezależnie aktualizować.You need a service that shares the overall lifecycle of your main application, but can be independently updated.
  • Potrzebna jest precyzyjna kontrola limitów zasobów dla określonego zasobu lub składnika.You need fine-grained control over resource limits for a particular resource or component. Na przykład można ograniczyć ilość pamięci, z której korzysta określony składnik.For example, you may want to restrict the amount of memory a specific component uses. Możesz wdrożyć składnik jako przyczepkę i zarządzać wykorzystaniem pamięci niezależnie od głównej aplikacji.You can deploy the component as a sidecar and manage memory usage independently of the main application.

Ten wzorzec może być nieodpowiedni w następujących przypadkach:This pattern may not be suitable:

  • Gdy komunikacja międzyprocesowa musi być zoptymalizowana.When interprocess communication needs to be optimized. Komunikacja między usługami aplikacji nadrzędnej i przyczepki obejmuje pewien narzut, a zwłaszcza opóźnienia w wywołaniach.Communication between a parent application and sidecar services includes some overhead, notably latency in the calls. Może to nie być akceptowalnym kompromisem dla intensywnie używanych interfejsów.This may not be an acceptable trade-off for chatty interfaces.
  • Dla małych aplikacji, gdzie koszt zasobu dla wdrożenia usługi przyczepki dla każdego wystąpienia nie jest wart korzyści z izolacji.For small applications where the resource cost of deploying a sidecar service for each instance is not worth the advantage of isolation.
  • Gdy usługa potrzebuje skalowania innego niż główne aplikacje lub niezależnego od nich.When the service needs to scale differently than or independently from the main applications. Jeśli tak, może lepiej będzie wdrożyć funkcję jako osobną usługę.If so, it may be better to deploy the feature as a separate service.

PrzykładExample

Wzorzec przyczepki ma zastosowanie do wielu scenariuszy.The sidecar pattern is applicable to many scenarios. Kilka typowych przykładów:Some common examples:

  • Interfejs API infrastruktury.Infrastructure API. Zespół deweloperów infrastruktury tworzy usługę, która jest wdrażana wraz z każdą aplikacją zamiast charakterystycznej dla języka biblioteki klienta, aby uzyskać dostęp do infrastruktury.The infrastructure development team creates a service that's deployed alongside each application, instead of a language-specific client library to access the infrastructure. Usługa jest ładowana jako przyczepka i zapewnia wspólną warstwę usług infrastruktury, takich jak rejestrowanie, dane środowiska, magazyn konfiguracji, odnajdywanie, moduł sprawdzania kondycji i usługi programu alarmowego.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. Przyczepka monitoruje również środowisko i proces (lub kontener) hosta aplikacji nadrzędnej oraz rejestruje informacje w scentralizowanej usłudze.The sidecar also monitors the parent application's host environment and process (or container) and logs the information to a centralized service.
  • Zarządzanie serwerem NGINX/HAProxy.Manage NGINX/HAProxy. Wdróż serwer NGINX z usługą przyczepki, która monitoruje stan środowiska, a następnie aktualizuje plik konfiguracji NGINX i powtarza proces, gdy są potrzebne zmiany stanu.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.
  • Przyczepka usługi ambasador.Ambassador sidecar. Wdróż usługę ambasador jako przyczepkę.Deploy an ambassador service as a sidecar. Aplikacja wykonuje wywołania za pośrednictwem usługi ambasador, która obsługuje rejestrowanie żądania, routing, przerwy w obwodzie i inne funkcje związane z łącznością.The application calls through the ambassador, which handles request logging, routing, circuit breaking, and other connectivity related features.
  • Odciążający serwer proxy.Offload proxy. Umieść serwer proxy NGINX przed wystąpieniem usługi node.js, aby obsługiwał zawartość plików statycznych dla usługi.Place an NGINX proxy in front of a node.js service instance, to handle serving static file content for the service.