Padrão de AmbassadorAmbassador pattern

Crie serviços de programa auxiliar que enviam pedidos de rede em nome de um serviço ou aplicação de consumidor.Create helper services that send network requests on behalf of a consumer service or application. Um serviço ambassador pode ser considerado como um proxy de fora do processo que está colocalizado com o cliente.An ambassador service can be thought of as an out-of-process proxy that is co-located with the client.

Este padrão pode ser útil para a descarga de tarefas comuns de conectividade de cliente, como monitorização, registo, encaminhamento, segurança (por exemplo, TLS), e padrões de resiliência numa forma agnóstica à 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. É frequentemente utilizado com aplicações legadas ou outras aplicações que são difíceis de modificar, para expandir as capacidades de rede.It is often used with legacy applications, or other applications that are difficult to modify, in order to extend their networking capabilities. Pode também ativar uma equipa especializada para implementar essas funcionalidades.It can also enable a specialized team to implement those features.

Contexto e problemaContext and problem

Aplicações com base na cloud resilientes necessitam de funcionalidades, como disjunção automática, encaminhamento, medição e monitorização e a capacidade de fazer atualizações de configuração relacionadas com a rede.Resilient cloud-based applications require features such as circuit breaking, routing, metering and monitoring, and the ability to make network-related configuration updates. Poderá ser difícil ou impossível atualizar aplicações legadas ou bibliotecas de código existentes para adicionar estas funcionalidades, porque o código já não é mantido ou não pode ser facilmente modificado pela equipa 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.

As chamadas de rede também poderão requerer uma configuração significativa da ligação, autenticação e autorização.Network calls may also require substantial configuration for connection, authentication, and authorization. Se estas chamadas forem utilizadas em várias aplicações criadas com várias linguagens e arquiteturas, as chamadas têm de ser configuradas para cada uma destas 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, a funcionalidade de rede e de segurança poderá ter de ser gerida por uma equipa central dentro da 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ódigos grande, pode ser arriscado para essa equipa atualizar o código da aplicação, se não estiver familiarizada com o mesmo.With a large code base, it can be risky for that team to update application code they aren't familiar with.

SoluçãoSolution

Coloque as estruturas e bibliotecas de cliente num processo externo que age como um proxy entre a sua aplicação e os serviços externos.Put client frameworks and libraries into an external process that acts as a proxy between your application and external services. Implemente o proxy no mesmo ambiente anfitrião da aplicação para permitir o controlo das funcionalidades de encaminhamento, resiliência, segurança e para evitar quaisquer restrições de acesso relacionadas com o anfitrião.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. Também pode utilizar o padrão de ambassador para uniformizar e expandir a instrumentação.You can also use the ambassador pattern to standardize and extend instrumentation. O proxy pode monitorizar as métricas de desempenho, como a latência ou utilização de recursos, e esta monitorização acontece no mesmo ambiente anfitrião da aplicação.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 de Ambassador

As funcionalidades que são descarregadas para o ambassador podem ser geridas de forma independente da aplicação.Features that are offloaded to the ambassador can be managed independently of the application. Pode atualizar e modificar o ambassador sem afetar a funcionalidade legada da aplicação.You can update and modify the ambassador without disturbing the application's legacy functionality. Também permite que equipas separadas e especializadas implementem e mantenham as funcionalidades de segurança, rede ou autenticação que foram movidas para o ambassador.It also allows for separate, specialized teams to implement and maintain security, networking, or authentication features that have been moved to the ambassador.

Serviços ambassador podem ser implementados como um sidecar para acompanhar o ciclo de vida de um aplicativo ou serviço de consumo.Ambassador services can be deployed as a sidecar to accompany the lifecycle of a consuming application or service. Em alternativa, se um ambassador for partilhado por vários processos separados num anfitrião comum, pode ser implementado como um daemon ou um serviço do 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 de consumo estiver em contentor, o ambassador deve ser criado como um contentor separado no mesmo anfitrião, com as ligações adequadas configuradas 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 de cliente, invocada diretamente pela aplicação, é uma abordagem melhor.Consider whether a client library, invoked directly by the application, is a better approach.
  • Considere o possível impacto de incluir funcionalidades generalizadas no proxy.Consider the possible impact of including generalized features in the proxy. Por exemplo, o ambassador poderia processar várias repetições, mas isto poderá 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 ao cliente passar algum contexto para o proxy, bem como de volta para o 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 pedido HTTP para recusar as repetições ou especificar o número máximo de vezes a repetir.For example, include HTTP request headers to opt out of retry or specify the maximum number of times to retry.
  • Considere como irá compactar e implementar o proxy.Consider how you will package and deploy the proxy.
  • Considere se vai utilizar uma única instância partilhada 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 utilizar este padrãoWhen to use this pattern

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

  • Tiver de criar um conjunto comum de funcionalidades de conectividade de cliente para várias linguagens ou estruturas.Need to build a common set of client connectivity features for multiple languages or frameworks.
  • Tiver de passar questões transversais de conectividade de cliente para programadores ou outras equipas mais especializadas.Need to offload cross-cutting client connectivity concerns to infrastructure developers or other more specialized teams.
  • Tiver de suportar requisitos da cloud ou de conectividade de cluster numa aplicação legada ou numa aplicação que é difícil modificar.Need to support cloud or cluster connectivity requirements in a legacy application or an application that is difficult to modify.

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

  • Quando a latência de pedidos de rede é crítica.When network request latency is critical. Um proxy introduz alguma sobrecarga, embora mínima e, em alguns casos, isto pode afetar a aplicação.A proxy will introduce some overhead, although minimal, and in some cases this may affect the application.
  • Quando as funcionalidades de conectividade do cliente são consumidas por uma única linguagem.When client connectivity features are consumed by a single language. Nesse caso, uma opção mais adequada pode ser uma biblioteca de cliente que é distribuída pelas equipas 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 as funcionalidades de conectividade não puderem ser generalizadas e requererem uma integração mais profunda na aplicação cliente.When connectivity features cannot be generalized and require deeper integration with the client application.

ExemploExample

O diagrama seguinte mostra uma aplicação a efetuar um pedido a um serviço remoto através de um proxy ambassador.The following diagram shows an application making a request to a remote service via an ambassador proxy. O ambassador fornece o encaminhamento, a disjunção automática e o registo.The ambassador provides routing, circuit breaking, and logging. Chama o serviço remoto e, em seguida, devolve a resposta à aplicação cliente:It calls the remote service and then returns the response to the client application:

Exemplo do padrão de Ambassador