Padrão de sidecarSidecar pattern

Implemente componentes de uma aplicação num processo ou contentor separado, para oferecer isolamento e encapsulamento.Deploy components of an application into a separate process or container to provide isolation and encapsulation. Este padrão também pode ativar as aplicações a ser compostas por componentes heterogéneos e tecnologias.This pattern can also enable applications to be composed of heterogeneous components and technologies.

Este padrão é denominado Sidecar porque se assemelha a um sidecar ligado a um motociclo.This pattern is named Sidecar because it resembles a sidecar attached to a motorcycle. No padrão, o sidecar está ligado a uma aplicação principal e proporciona funcionalidades de suporte para a aplicação.In the pattern, the sidecar is attached to a parent application and provides supporting features for the application. O sidecar também partilha o mesmo ciclo de vida da aplicação principal, que está a ser criado e extinguido juntamente com o elemento principal.The sidecar also shares the same lifecycle as the parent application, being created and retired alongside the parent. O padrão de sidecar é, por vezes, referido como o padrão de sidekick e é um padrão de decomposição.The sidecar pattern is sometimes referred to as the sidekick pattern and is a decomposition pattern.

Contexto e problemaContext and Problem

As aplicações e serviços, muitas vezes, precisam de funcionalidades relacionadas, como monitorização, registo, configuração e serviços de rede.Applications and services often require related functionality, such as monitoring, logging, configuration, and networking services. Estas tarefas periféricas podem ser implementadas como componentes ou serviços separados.These peripheral tasks can be implemented as separate components or services.

Se estiverem totalmente integrados na aplicação, podem ser executados no mesmo processo que a aplicação, fazendo uma utilização eficiente dos recursos partilhados.If they are tightly integrated into the application, they can run in the same process as the application, making efficient use of shared resources. No entanto, também significa que não são bem isolados e uma falha nestes componentes pode afetar outros componentes ou toda a aplicação.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. Além disso, normalmente, têm de ser implementados com a mesma linguagem que a aplicação principal.Also, they usually need to be implemented using the same language as the parent application. Como resultado, o componente e a aplicação estão estreitamente interligados.As a result, the component and the application have close interdependence on each other.

Se a aplicação for decomposta em serviços, cada serviço poderá ser criado através de linguagens e tecnologias diferentes.If the application is decomposed into services, then each service can be built using different languages and technologies. Embora proporcione uma maior flexibilidade, significa que cada componente tem as suas próprias dependências e requer bibliotecas específicas da linguagem para aceder à plataforma subjacente e a quaisquer recursos partilhados com a aplicação principal.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. Além disso, a implementação destas funcionalidades como serviços separados pode adicionar latência à aplicação.In addition, deploying these features as separate services can add latency to the application. A gestão do código e das dependências para estas interfaces específicas da linguagem pode também adicionar uma complexidade considerável, especialmente para o alojamento, a implementação e a gestão.Managing the code and dependencies for these language-specific interfaces can also add considerable complexity, especially for hosting, deployment, and management.

SoluçãoSolution

Colocalize um conjunto coeso de tarefas com a aplicação principal, mas coloque-as no interior do seu próprio processo ou contentor, fornecendo uma interface homogénea para serviços da plataforma nas várias linguagens.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.

Diagrama do padrão de Sidecar

Um serviço de sidecar não tem de fazer necessariamente parte da aplicação, mas está ligado à mesma.A sidecar service is not necessarily part of the application, but is connected to it. Vai onde a aplicação vai.It goes wherever the parent application goes. Os sidecars são processos ou serviços de apoio que são implementados com a aplicação principal.Sidecars are supporting processes or services that are deployed with the primary application. Num motociclo, o sidecar está ligado a um motociclo e cada um pode ter o seu próprio sidecar.On a motorcycle, the sidecar is attached to one motorcycle, and each motorcycle can have its own sidecar. Da mesma forma, um serviço de sidecar partilha o destino da aplicação principal.In the same way, a sidecar service shares the fate of its parent application. Para cada instância da aplicação, uma instância do sidecar é implementada e alojada em conjunto com a mesma.For each instance of the application, an instance of the sidecar is deployed and hosted alongside it.

Vantagens da utilização de um padrão de sidecar:Advantages of using a sidecar pattern include:

  • Um sidecar é independente da aplicação principal em termos de ambiente de tempo de execução e linguagem de programação, pelo que não precisa de desenvolver um sidecar por linguagem.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.

  • O sidecar pode aceder aos mesmos recursos que a aplicação principal.The sidecar can access the same resources as the primary application. Por exemplo, um sidecar pode monitorizar os recursos do sistema utilizados pelo sidecar e pela aplicação principal.For example, a sidecar can monitor system resources used by both the sidecar and the primary application.

  • Devido à sua proximidade com a aplicação principal, não há qualquer latência significativa ao comunicar entre eles.Because of its proximity to the primary application, there’s no significant latency when communicating between them.

  • Mesmo para as aplicações que não proporcionam um mecanismo de extensibilidade, pode utilizar um sidecar para expandir a funcionalidade ao ligá-la como um processo próprio no mesmo anfitrião ou subcontentor que a aplicação principal.Even for applications that don’t provide an extensibility mechanism, you can use a sidecar to extend functionality by attaching it as own process in the same host or sub-container as the primary application.

O padrão de sidecar é, muitas vezes, utilizado com contentores e referido como um contentor de sidecar ou contentor de sidekick.The sidecar pattern is often used with containers and referred to as a sidecar container or sidekick container.

Problemas e consideraçõesIssues and Considerations

  • Considere a implementação e o formato de empacotamento que irá utilizar para implementar serviços, processos ou contentores.Consider the deployment and packaging format you will use to deploy services, processes, or containers. Os contentores são particularmente adequados para o padrão do sidecar.Containers are particularly well suited to the sidecar pattern.
  • Ao conceber um serviço de sidecar, decida cuidadosamente o mecanismo de comunicação interprocessos.When designing a sidecar service, carefully decide on the interprocess communication mechanism. Tente utilizar tecnologias de linguagem ou arquitetura desconhecidas, exceto se os requisitos de desempenho o tornarem impraticável.Try to use language- or framework-agnostic technologies unless performance requirements make that impractical.
  • Antes de colocar a funcionalidade num sidecar, considere se funciona melhor como um serviço separado ou um daemon mais tradicional.Before putting functionality into a sidecar, consider whether it would work better as a separate service or a more traditional daemon.
  • Também considere se a funcionalidade pode ser implementada como uma biblioteca ou com a ajuda de um mecanismo de extensão tradicional.Also consider whether the functionality could be implemented as a library or using a traditional extension mechanism. As bibliotecas específicas da linguagem podem ter um nível mais aprofundado de integração e menos custos de rede.Language-specific libraries may have a deeper level of integration and less network overhead.

Quando Utilizar este PadrãoWhen to Use this Pattern

Utilize este padrão quando:Use this pattern when:

  • A aplicação principal utilizar um conjunto heterogéneo de linguagens e arquiteturas.Your primary application uses a heterogenous set of languages and frameworks. Um componente localizado num serviço de sidecar pode ser utilizado por aplicações escritas em linguagens diferentes, através de arquiteturas diferentes.A component located in a sidecar service can be consumed by applications written in different languages using different frameworks.
  • Um componente pertencer a uma equipa remota ou a uma organização diferente.A component is owned by a remote team or a different organization.
  • Um componente ou uma funcionalidade tiver de estar colocalizado no mesmo anfitrião que a aplicaçãoA component or feature must be co-located on the same host as the application
  • Precisar de um serviço que partilhe o ciclo de vida global da aplicação principal, mas que possa ser atualizado de forma independente.You need a service that shares the overall lifecycle of your main application, but can be independently updated.
  • Precisat de um controlo detalhado dos limites de recursos para um componente ou recurso em particular.You need fine-grained control over resource limits for a particular resource or component. Por exemplo, poderá querer restringir a quantidade de memória que um componente específico utiliza.For example, you may want to restrict the amount of memory a specific component uses. Pode implementar o componente como um sidecar e gerir a utilização de memória, independentemente da aplicação principal.You can deploy the component as a sidecar and manage memory usage independently of the main application.

Este padrão pode não ser adequado:This pattern may not be suitable:

  • Quando a comunicação interprocessos tem de ser otimizada.When interprocess communication needs to be optimized. A comunicação entre uma aplicação principal e os serviços de sidecar inclui alguma sobrecarga, nomeadamente latência nas chamadas.Communication between a parent application and sidecar services includes some overhead, notably latency in the calls. Esta desvantagem pode não ser aceitável para conversações longas.This may not be an acceptable trade-off for chatty interfaces.
  • Para aplicações pequenas onde o custo de recursos de implementação de um serviço de sidecar para cada instância não valha a vantagem de isolamento.For small applications where the resource cost of deploying a sidecar service for each instance is not worth the advantage of isolation.
  • Quando o serviço tem de dimensionar de forma diferente ou independente das aplicações principais.When the service needs to scale differently than or independently from the main applications. Se assim for, poderá ser melhor implementar a funcionalidade como um serviço separado.If so, it may be better to deploy the feature as a separate service.

ExemploExample

O padrão de sidecar é aplicável a vários cenários.The sidecar pattern is applicable to many scenarios. Alguns exemplos comuns:Some common examples:

  • API da infraestrutura.Infrastructure API. A equipa de desenvolvimento da infraestrutura cria um serviço que é implementado juntamente com cada aplicação, em vez de uma biblioteca de cliente específica da linguagem para aceder à infraestrutura.The infrastructure development team creates a service that's deployed alongside each application, instead of a language-specific client library to access the infrastructure. O serviço está carregado como um sidecar e proporciona uma camada comum para os serviços de infraestrutura, incluindo registos, dados do ambiente, arquivo de configuração, deteção, verificações do estado de funcionamento e serviços de watchdog.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. O sidecar também monitoriza o ambiente do anfitrião da aplicação principal e o processo (ou contentor) e regista as informações num serviço centralizado.The sidecar also monitors the parent application's host environment and process (or container) and logs the information to a centralized service.
  • Gerir o NGINX/HAProxy.Manage NGINX/HAProxy. Implemente o NGINX com um serviço de sidecar que monitoriza o estado do ambiente, atualiza o ficheiro de configuração NGINX e recicla o processo quando é preciso uma alteração do estado.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.
  • Sidecar ambassador.Ambassador sidecar. Implementar um ambassador serviço como um sidecar.Deploy an ambassador service as a sidecar. A aplicação chama através do ambassador, que processa o registo de pedidos, encaminhamento, disjuntor de circuito e outras funcionalidades relacionadas com a conectividade.The application calls through the ambassador, which handles request logging, routing, circuit breaking, and other connectivity related features.
  • Descarregar o proxy.Offload proxy. Coloque um proxy NGINX à frente de uma instância de serviço node.js, para processar o conteúdo do ficheiro estático do serviço.Place an NGINX proxy in front of a node.js service instance, to handle serving static file content for the service.