Padrão embaixadorAmbassador pattern

Crie serviços auxiliares que enviam solicitações de rede em nome de um consumidor de serviço ou aplicativo.Create helper services that send network requests on behalf of a consumer service or application. Um serviço Embaixador pode ser pensado como um proxy de fora do processo colocalizado com o cliente.An ambassador service can be thought of as an out-of-process proxy that is co-located with the client.

Esse padrão pode ser útil para descarregar tarefas comuns de conectividade do cliente, como monitoramento, registro em log, roteamento, segurança (como TLS) e padrões de resiliência de maneira independente de linguagem.This pattern can be useful for offloading common client connectivity tasks such as monitoring, logging, routing, security (such as TLS), and resiliency patterns in a language agnostic way. Ele geralmente é usado com aplicativos herdados ou outros aplicativos difíceis de modificar, para ampliar seus recursos de rede.It is often used with legacy applications, or other applications that are difficult to modify, in order to extend their networking capabilities. Também pode habilitar uma equipe especializada para implementar esses recursos.It can also enable a specialized team to implement those features.

Contexto e problemaContext and problem

Aplicativos baseados em nuvem resilientes exigem recursos como interrupção de circuito, roteamento, medição e monitoramento, além da capacidade de fazer atualizações de configuração relacionadas à rede.Resilient cloud-based applications require features such as circuit breaking, routing, metering and monitoring, and the ability to make network-related configuration updates. Pode ser difícil ou impossível atualizar aplicativos herdados ou bibliotecas de código existente para adicionar esses recursos, pois o código não será mais mantido ou não poderá ser facilmente modificado pela equipe de desenvolvimento.It may be difficult or impossible to update legacy applications or existing code libraries to add these features, because the code is no longer maintained or can't be easily modified by the development team.

Chamadas de rede também podem exigir configuração significativa para conexão, autenticação e autorização.Network calls may also require substantial configuration for connection, authentication, and authorization. Se essas chamadas forem usadas em vários aplicativos, criados usando vários idiomas e estruturas, as chamadas deverão ser configuradas para cada uma dessas instâncias.If these calls are used across multiple applications, built using multiple languages and frameworks, the calls must be configured for each of these instances. Além disso, funcionalidade de segurança de rede poderá precisar ser gerenciada por uma equipe central na sua organização.In addition, network and security functionality may need to be managed by a central team within your organization. Com uma base de código grande, pode ser arriscado para essa equipe atualizar código de aplicativo com a qual não esteja familiarizada.With a large code base, it can be risky for that team to update application code they aren't familiar with.

SoluçãoSolution

Coloque estruturas e bibliotecas de cliente em um processo externo que atue como proxy entre seus aplicativos e serviços externos.Put client frameworks and libraries into an external process that acts as a proxy between your application and external services. Implante o proxy no mesmo ambiente de host que seu aplicativo para permitir o controle sobre roteamento, resiliência e recursos de segurança, além de evitar quaisquer restrições de acesso relacionadas ao host.Deploy the proxy on the same host environment as your application to allow control over routing, resiliency, security features, and to avoid any host-related access restrictions. Você também pode usar o padrão de embaixador para padronizar e estender a instrumentação.You can also use the ambassador pattern to standardize and extend instrumentation. O proxy pode monitorar métricas de desempenho, como latência ou uso de recursos, e esse monitoramento acontece no mesmo ambiente de host que o aplicativo.The proxy can monitor performance metrics such as latency or resource usage, and this monitoring happens in the same host environment as the application.

Diagrama do padrão Embaixador

Os recursos que são descarregados para o embaixador podem ser gerenciados de maneira independente do aplicativo.Features that are offloaded to the ambassador can be managed independently of the application. Você pode atualizar e modificar o embaixador sem afetar a funcionalidade herdada do aplicativo.You can update and modify the ambassador without disturbing the application's legacy functionality. Ele também permite equipes especializadas separadas implementar e manter os recursos de segurança, rede ou autenticação movidos para o embaixador.It also allows for separate, specialized teams to implement and maintain security, networking, or authentication features that have been moved to the ambassador.

Os serviços do embaixador podem ser implantados como um sidecar para acompanhar o ciclo de vida de um aplicativo ou serviço de consumidor.Ambassador services can be deployed as a sidecar to accompany the lifecycle of a consuming application or service. Como alternativa, se um embaixador for compartilhado por vários processos separados em um host em comum, ele poderá ser implantado como um daemon ou o serviço Windows.Alternatively, if an ambassador is shared by multiple separate processes on a common host, it can be deployed as a daemon or Windows service. Se o serviço consumidor estiver em contêineres, o embaixador deverá ser criado como um contêiner separado no mesmo host, com os links apropriados configurados para comunicação.If the consuming service is containerized, the ambassador should be created as a separate container on the same host, with the appropriate links configured for communication.

Problemas e consideraçõesIssues and considerations

  • O proxy adiciona alguma sobrecarga de latência.The proxy adds some latency overhead. Considere se uma biblioteca cliente, invocada diretamente pelo aplicativo, é uma abordagem melhor.Consider whether a client library, invoked directly by the application, is a better approach.
  • Considere o possível impacto de incluir recursos generalizados no proxy.Consider the possible impact of including generalized features in the proxy. Por exemplo, o embaixador pode lidar com novas tentativas, mas isso pode não ser seguro, a menos que todas as operações sejam idempotentes.For example, the ambassador could handle retries, but that might not be safe unless all operations are idempotent.
  • Considere um mecanismo para permitir que o cliente passe algum contexto para o proxy, bem como de volta ao cliente.Consider a mechanism to allow the client to pass some context to the proxy, as well as back to the client. Por exemplo, inclua cabeçalhos de solicitação HTTP para recusar a nova tentativa ou especificar o número máximo de tentativas.For example, include HTTP request headers to opt out of retry or specify the maximum number of times to retry.
  • Considere como você vai empacotar e implantar o proxy.Consider how you will package and deploy the proxy.
  • Considere se vai usar uma única instância compartilhada para todos os clientes ou uma instância para cada cliente.Consider whether to use a single shared instance for all clients or an instance for each client.

Quando usar esse padrãoWhen to use this pattern

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

  • For necessário criar um conjunto comum de recursos de conectividade do cliente para vários idiomas ou estruturas.Need to build a common set of client connectivity features for multiple languages or frameworks.
  • For necessário descarregar preocupações de conectividade de cliente cross-cutting para os desenvolvedores de infraestrutura ou outras equipes mais especializadas.Need to offload cross-cutting client connectivity concerns to infrastructure developers or other more specialized teams.
  • For necessário dar suporte a requisitos de conectividade em nuvem ou cluster em um aplicativo herdado ou em um aplicativo difícil de modificar.Need to support cloud or cluster connectivity requirements in a legacy application or an application that is difficult to modify.

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

  • Quando a latência de solicitação de rede for crítica.When network request latency is critical. Um proxy introduzirá alguma sobrecarga, embora mínima e, em alguns casos, isso poderá afetar o aplicativo.A proxy will introduce some overhead, although minimal, and in some cases this may affect the application.
  • Quando os recursos de conectividade de cliente forem consumidos por uma única linguagem.When client connectivity features are consumed by a single language. Nesse caso, a melhor opção pode ser uma biblioteca cliente distribuída para as equipes de desenvolvimento como um pacote.In that case, a better option might be a client library that is distributed to the development teams as a package.
  • Quando os recursos de conectividade não podem ser generalizados e exigem uma integração mais profunda com o aplicativo cliente.When connectivity features cannot be generalized and require deeper integration with the client application.

ExemploExample

O diagrama a seguir mostra um aplicativo fazendo uma solicitação para um serviço remoto por meio de um proxy embaixador.The following diagram shows an application making a request to a remote service via an ambassador proxy. O embaixador possibilita roteamento, interrupção de circuito e registro em log.The ambassador provides routing, circuit breaking, and logging. Ele chama o serviço remoto e, em seguida, retorna a resposta ao aplicativo cliente:It calls the remote service and then returns the response to the client application:

Exemplo de um padrão Embaixador