Padrão sidecarSidecar pattern

Implante os componentes de um aplicativo em um processo ou contêiner separado para fornecer isolamento e encapsulamento.Deploy components of an application into a separate process or container to provide isolation and encapsulation. Esse padrão também pode habilitar aplicativos para serem compostos por tecnologias e componentes heterogêneos.This pattern can also enable applications to be composed of heterogeneous components and technologies.

Esse padrão é denominado Sidecar porque é semelhante a um sidecar anexado a uma moto.This pattern is named Sidecar because it resembles a sidecar attached to a motorcycle. No padrão, o sidecar está anexado a um aplicativo pai e fornece recursos de suporte para o aplicativo.In the pattern, the sidecar is attached to a parent application and provides supporting features for the application. O sidecar também compartilha o mesmo ciclo de vida do aplicativo pai, sendo criado e desativado junto com ele.The sidecar also shares the same lifecycle as the parent application, being created and retired alongside the parent. O padrão sidecar às vezes é conhecido 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

Aplicativos e serviços geralmente requerem funcionalidades relacionadas, como monitoramento, registro em log, configuração e serviços de rede.Applications and services often require related functionality, such as monitoring, logging, configuration, and networking services. Essas tarefas periféricas podem ser implementadas como componentes ou serviços separados.These peripheral tasks can be implemented as separate components or services.

Se elas estiverem intimamente integrados ao aplicativo, poderão ser executadas no mesmo processo que o aplicativo, usando com eficiência os recursos compartilhados.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, isso também significa que eles não são bem isolados e uma interrupção em um desses componentes poderia afetar os demais componentes ou todo o aplicativo.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, eles geralmente precisam ser implementados usando o mesmo idioma que o aplicativo pai.Also, they usually need to be implemented using the same language as the parent application. Como resultado, o componente e o aplicativo têm uma interdependência íntima entre si.As a result, the component and the application have close interdependence on each other.

Se o aplicativo for decomposto em serviços, cada serviço poderá ser compilado usando diferentes linguagens e tecnologias.If the application is decomposed into services, then each service can be built using different languages and technologies. Embora isso proporcione maior flexibilidade, também significa que cada componente tem suas próprias dependências e requer bibliotecas específicas a um idioma para acessar a plataforma subjacente e qualquer recurso compartilhados com o aplicativo pai.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, implantar esses recursos como serviços separados pode acrescentar latência ao aplicativo.In addition, deploying these features as separate services can add latency to the application. Gerenciar o código e as dependências para essas interfaces específicas a um idioma também pode agregar considerável complexidade, especialmente para hospedagem, implantação e gerenciamento.Managing the code and dependencies for these language-specific interfaces can also add considerable complexity, especially for hosting, deployment, and management.

SoluçãoSolution

Posicione um conjunto consistente de tarefas no aplicativo principal, porém coloque-os dentro de seu próprio processo ou contêiner, fornecendo uma interface homogênea para serviços de plataforma entre 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 Sidecar

Um serviço sidecar não faz necessariamente parte do aplicativo, mas está conectado a ele.A sidecar service is not necessarily part of the application, but is connected to it. Ele irá sempre onde o aplicativo pai for.It goes wherever the parent application goes. Sidecars são processos ou serviços de apoio que são implantados com o aplicativo principal.Sidecars are supporting processes or services that are deployed with the primary application. Em um moto, o sidecar é anexado a uma moto e cada moto pode ter 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 sidecar compartilha a sina de seu aplicativo pai.In the same way, a sidecar service shares the fate of its parent application. Para cada instância do aplicativo, uma instância do sidecar é implantada e hospedada junto com ele.For each instance of the application, an instance of the sidecar is deployed and hosted alongside it.

Vantagens de usar um padrão de sidecar:Advantages of using a sidecar pattern include:

  • Um sidecar é independente do seu aplicativo principal em termos de ambiente de tempo de execução e de linguagem de programação, portanto você não precisa 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 acessar os mesmos recursos que o aplicativo principal.The sidecar can access the same resources as the primary application. Por exemplo, um sidecar pode monitorar os recursos do sistema usados tanto por ele mesmo quanto pelo aplicativo principal.For example, a sidecar can monitor system resources used by both the sidecar and the primary application.

  • Por causa de sua proximidade do aplicativo principal, não há latência significativa ao se comunicar entre eles.Because of its proximity to the primary application, there’s no significant latency when communicating between them.

  • Mesmo para aplicativos que não fornecem um mecanismo de extensibilidade, você pode usar um sidecar para estender a funcionalidade anexando-o como seu próprio processo no mesmo host ou subcontêiner como o aplicativo principal.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.

O padrão de sidecar geralmente é usado com contêineres e conhecido como um contêiner de sidecar ou 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 implantação e o formato de empacotamento que você usará para implantar serviços, processos ou contêineres.Consider the deployment and packaging format you will use to deploy services, processes, or containers. Contêineres são especialmente adequados para o padrão de sidecar.Containers are particularly well suited to the sidecar pattern.
  • Ao projetar um serviço sidecar, escolha cuidadosamente o mecanismo de comunicação entre processos.When designing a sidecar service, carefully decide on the interprocess communication mechanism. Experimente usar tecnologias independente de linguagem ou estrutura, a menos que os requisitos de desempenho tornem isso inviável.Try to use language- or framework-agnostic technologies unless performance requirements make that impractical.
  • Antes de colocar a funcionalidade em um sidecar, considere se ela funcionaria 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.
  • Considere também se a funcionalidade poderia ser implementada como uma biblioteca ou usando um mecanismo de extensão tradicional.Also consider whether the functionality could be implemented as a library or using a traditional extension mechanism. Bibliotecas específicas a um idioma podem ter um nível mais profundo de integração e menos sobrecarga de rede.Language-specific libraries may have a deeper level of integration and less network overhead.

Quando usar esse padrãoWhen to Use this Pattern

Use esse padrão quando:Use this pattern when:

  • O aplicativo principal usa um conjunto heterogêneo de linguagens e estruturas.Your primary application uses a heterogeneous set of languages and frameworks. Um componente localizado em um serviço secundários pode ser consumido por aplicativos escritos em linguagens diferentes usando estruturas diferentes.A component located in a sidecar service can be consumed by applications written in different languages using different frameworks.
  • Um componente pertence a uma equipe remota ou a uma organização diferente.A component is owned by a remote team or a different organization.
  • Um componente ou recurso deve ser localizado no mesmo host que o aplicativoA component or feature must be co-located on the same host as the application
  • Você precisa de um serviço que compartilha o ciclo de vida geral do aplicativo principal, mas pode ser atualizado independentemente.You need a service that shares the overall lifecycle of your main application, but can be independently updated.
  • Você precisa de controle refinado sobre os limites do recurso para determinado recurso ou componente.You need fine-grained control over resource limits for a particular resource or component. Por exemplo, você talvez queira restringir a quantidade de memória que um componente específico usa.For example, you may want to restrict the amount of memory a specific component uses. Você pode implantar o componente como um sidecar e gerenciar o uso de memória, independentemente do aplicativo principal.You can deploy the component as a sidecar and manage memory usage independently of the main application.

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

  • Quando a comunicação entre processos precisa ser otimizada.When interprocess communication needs to be optimized. A comunicação entre um aplicativo pai e os serviços de sidecar incluem certa sobrecarga e latência notável nas chamadas.Communication between a parent application and sidecar services includes some overhead, notably latency in the calls. Essa pode não ser uma compensação aceitável para interfaces verborrágicas.This may not be an acceptable trade-off for chatty interfaces.
  • Para pequenos aplicativos em que o custo do recurso da implantação de um serviço de sidecar para cada instância não compensa 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 precisa ser dimensionado de forma diferente ou independente dos aplicativos principais.When the service needs to scale differently than or independently from the main applications. Nesse caso, é melhor implantar o recurso como um serviço separado.If so, it may be better to deploy the feature as a separate service.

ExemploExample

O padrão sidecar se aplica a muitos cenários.The sidecar pattern is applicable to many scenarios. Alguns exemplos comuns:Some common examples:

  • API de Infraestrutura.Infrastructure API. A equipe de desenvolvimento de infraestrutura cria um serviço implantado ao lado de cada aplicativo, em vez de uma biblioteca de cliente específica a um idioma para acessar a 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 é carregado como um sidecar e fornece uma camada comum para serviços de infraestrutura, incluindo registro em log, dados de ambiente, repositório de configuração, descoberta, verificações de integridade 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 secundário também monitora o ambiente de host do aplicativo pai e o processo (ou contêiner) e registra as informações em um 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.
  • Gerenciar NGINX/HAProxy.Manage NGINX/HAProxy. Implante NGINX com um serviço sidecar que monitora o estado do ambiente, em seguida, atualize o arquivo de configuração NGINX e recicle o processo quando uma alteração de estado é necessária.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 embaixador.Ambassador sidecar. Implantar um serviço embaixador como um sidecar.Deploy an ambassador service as a sidecar. O aplicativo chama por meio do embaixador, que lida com o registro em log de solicitações, roteamento, quebra de circuito e demais recursos relacionados à conectividade.The application calls through the ambassador, which handles request logging, routing, circuit breaking, and other connectivity related features.
  • Proxy de descarregamento.Offload proxy. Coloque um proxy NGINX na frente de uma instância de serviço do node.js, para manipular a distribuição do conteúdo de arquivo estático para o serviço.Place an NGINX proxy in front of a node.js service instance, to handle serving static file content for the service.