Estruturar microsserviços: Comunicação entre serviçosDesigning microservices: Interservice communication

Comunicação entre os microsserviços tem de ser robusto e eficiente.Communication between microservices must be efficient and robust. Com muitos serviços pequenos interagir para concluir uma única transação, isso pode ser um desafio.With lots of small services interacting to complete a single transaction, this can be a challenge. Neste capítulo, vamos ver as compensações entre as mensagens assíncronas versus APIs síncronas.In this chapter, we look at the tradeoffs between asynchronous messaging versus synchronous APIs. Em seguida, vamos ver alguns dos desafios na conceção de comunicação originar resiliente e a função que pode atuar como uma malha de serviço.Then we look at some of the challenges in designing resilient interservice communication, and the role that a service mesh can play.

Diagrama de comunicação originar

DesafiosChallenges

Aqui estão alguns dos principais desafios resultantes de comunicação de serviço para serviço.Here are some of the main challenges arising from service-to-service communication. As malhas de serviço, descritas mais adiante neste capítulo, foram criadas para lidar com muitos desses desafios.Service meshes, described later in this chapter, are designed to handle many of these challenges.

Resiliência.Resiliency. Pode haver dezenas ou até mesmo centenas de instâncias de qualquer determinado microsserviços.There may be dozens or even hundreds of instances of any given microservice. Uma instância pode falhar por diversas razões.An instance can fail for any number of reasons. Pode haver uma falha de nível de nó, como uma falha de hardware ou um reinício VM.There can be a node-level failure, such as a hardware failure or a VM reboot. Uma instância poderá falhar ou ser sobrecarregado com pedidos e não é possível processar as novas solicitações.An instance might crash, or be overwhelmed with requests and unable to process any new requests. Qualquer um desses eventos pode fazer com que uma chamada de rede efetuar a ativação.Any of these events can cause a network call to fail. Existem dois padrões de design que podem ajudar a fazer chamadas de rede de serviços mais resilientes:There are two design patterns that can help make service-to-service network calls more resilient:

  • Repita.Retry. Uma chamada de rede poderão falhar devido a falhas transitórias que desaparece por si só.A network call may fail because of a transient fault that goes away by itself. Em vez de falhar totalmente, o chamador, normalmente, deve repetir a operação de um determinado número de vezes, ou até que o período de um período de tempo limite configurado.Rather than fail outright, the caller should typically retry the operation a certain number of times, or until a configured time-out period elapses. No entanto, se uma operação não for idempotente, as repetições podem causar efeitos colaterais indesejados.However, if an operation is not idempotent, retries can cause unintended side effects. A chamada original, talvez seja bem-sucedida, mas o chamador nunca obtém uma resposta.The original call might succeed, but the caller never gets a response. Se repete o chamador, a operação pode ser invocada duas vezes.If the caller retries, the operation may be invoked twice. Em geral, não é seguro repetir a mensagem ou corrigir os métodos, porque estes não são garantidos sejam idempotentes.Generally, it's not safe to retry POST or PATCH methods, because these are not guaranteed to be idempotent.

  • Disjuntor.Circuit Breaker. Demasiados pedidos falhados podem provocar um estrangulamento, à medida que pedidos pendentes se acumulam na fila.Too many failed requests can cause a bottleneck, as pending requests accumulate in the queue. Estes pedidos bloqueados poderão conter recursos de sistema cruciais, como memória, threads, ligações de base de dados, etc., que podem provocar falhas em cascata.These blocked requests might hold critical system resources such as memory, threads, database connections, and so on, which can cause cascading failures. O padrão de disjuntor automático pode impedir um serviço de tentar repetidamente uma operação que é provável que falhe.The Circuit Breaker pattern can prevent a service from repeatedly trying an operation that is likely to fail.

O balanceamento de carga.Load balancing. Quando o serviço "A" chama o serviço "B", o pedido tem de atingir uma instância em execução do serviço "B".When service "A" calls service "B", the request must reach a running instance of service "B". No Kubernetes, o Service tipo de recurso fornece um endereço IP estável para um grupo de pods.In Kubernetes, the Service resource type provides a stable IP address for a group of pods. Tráfego de rede para o endereço IP do serviço obtém reencaminhado para um pod por meio de regras de iptable.Network traffic to the service's IP address gets forwarded to a pod by means of iptable rules. Por predefinição, é escolhido um pod aleatório.By default, a random pod is chosen. Uma malha de serviço (ver abaixo) pode fornecer mais inteligente com base na latência observada ou outras métricas de algoritmos de balanceamento de carga.A service mesh (see below) can provide more intelligent load balancing algorithms based on observed latency or other metrics.

Distribuído rastreio.Distributed tracing. Uma única transação pode abranger vários serviços.A single transaction may span multiple services. Que pode tornar mais difícil monitorizar o desempenho geral e o estado de funcionamento do sistema.That can make it hard to monitor the overall performance and health of the system. Mesmo que cada serviço gera registos e métricas, sem alguma forma para associá-las em conjunto, são de uso limitado.Even if every service generates logs and metrics, without some way to tie them together, they are of limited use. O capítulo registo e monitorização fala mais informações sobre como distribuída rastreamento, mas que mencionamos-lo aqui como um desafio.The chapter Logging and monitoring talks more about distributed tracing, but we mention it here as a challenge.

Controlo de versões de serviço.Service versioning. Quando uma equipe implementa uma nova versão de um serviço, tem de evitar a quebra de quaisquer outros serviços ou clientes externos que dependem dele.When a team deploys a new version of a service, they must avoid breaking any other services or external clients that depend on it. Além disso, pode querer executar várias versões de uma serviço lado a lado e encaminhar os pedidos para uma versão específica.In addition, you might want to run multiple versions of a service side-by-side, and route requests to a particular version. Ver controlo de versões de API para descrição mais detalhada sobre este problema.See API Versioning for more discussion of this issue.

Autenticação de TLS de encriptação e mútua TLS.TLS encryption and mutual TLS authentication. Por motivos de segurança, pode querer criptografar o tráfego entre os serviços com TLS e utilizar a autenticação mútua de TLS para autenticar chamadores.For security reasons, you may want to encrypt traffic between services with TLS, and use mutual TLS authentication to authenticate callers.

Síncrona versus assíncrona de mensagensSynchronous versus asynchronous messaging

Existem dois padrões de mensagens básicos que microsserviços podem utilizar para comunicar com outros microsserviços.There are two basic messaging patterns that microservices can use to communicate with other microservices.

  1. Comunicação síncrona.Synchronous communication. Neste padrão, um serviço chama uma API que expõe a outro serviço, utilizando um protocolo, como HTTP ou gRPC.In this pattern, a service calls an API that another service exposes, using a protocol such as HTTP or gRPC. Esta opção é um padrão de mensagens síncrono, porque o chamador aguarda uma resposta do destinatário.This option is a synchronous messaging pattern because the caller waits for a response from the receiver.

  2. Transmissão de mensagens assíncronas.Asynchronous message passing. Neste padrão, um serviço envia a mensagem sem aguardar uma resposta e um ou mais serviços a processar a mensagem de forma assíncrona.In this pattern, a service sends message without waiting for a response, and one or more services process the message asynchronously.

É importante distinguir entre e/s assíncrona e um protocolo de assíncrono.It's important to distinguish between asynchronous I/O and an asynchronous protocol. E/s assíncrona significa que o thread de chamada não está bloqueado enquanto a e/s é concluída.Asynchronous I/O means the calling thread is not blocked while the I/O completes. Isso é importante para o desempenho, mas é um detalhe de implementação em termos de arquitetura.That's important for performance, but is an implementation detail in terms of the architecture. Um protocolo assíncrono significa que o remetente não tem de aguardar por uma resposta.An asynchronous protocol means the sender doesn't wait for a response. O HTTP é um protocolo síncrono, mesmo que um cliente HTTP pode utilizar a e/s assíncrona quando envia um pedido.HTTP is a synchronous protocol, even though an HTTP client may use asynchronous I/O when it sends a request.

Existem vantagens e desvantagens de cada padrão.There are tradeoffs to each pattern. Pedido/resposta é um paradigma bem compreendido, para que criar uma API pode se sentir mais natural do design de um sistema de mensagens.Request/response is a well-understood paradigm, so designing an API may feel more natural than designing a messaging system. No entanto, o serviço de mensagens assíncrono tem algumas vantagens que podem ser muito útil numa arquitetura de microsserviços:However, asynchronous messaging has some advantages that can be very useful in a microservices architecture:

  • Reduzido o acoplamento.Reduced coupling. O remetente da mensagem não precisa saber sobre o consumidor.The message sender does not need to know about the consumer.

  • Vários subscritores.Multiple subscribers. Vários consumidores usando um modelo de pub/sub, podem subscrever para receber eventos.Using a pub/sub model, multiple consumers can subscribe to receive events. Ver estilo de arquitetura condicionada por eventos.See Event-driven architecture style.

  • Isolamento de falhas.Failure isolation. Se o consumidor falhar, o remetente pode ainda enviar mensagens.If the consumer fails, the sender can still send messages. As mensagens serão detetadas quando recupera o consumidor.The messages will be picked up when the consumer recovers. Essa capacidade é especialmente útil numa arquitetura de microsserviços, uma vez que cada serviço tem seu próprio ciclo de vida.This ability is especially useful in a microservices architecture, because each service has its own lifecycle. Um serviço pode ficar indisponível ou ser substituído por uma versão mais recente em qualquer momento.A service could become unavailable or be replaced with a newer version at any given time. Mensagens assíncronas podem manipular o tempo de inatividade intermitente.Asynchronous messaging can handle intermittent downtime. APIs síncronas, por outro lado, requerem o serviço downstream deve estar disponível ou a operação falhar.Synchronous APIs, on the other hand, require the downstream service to be available or the operation fails.

  • Capacidade de resposta.Responsiveness. Um serviço a montante pode responder mais rapidamente se ele não aguarda em serviços downstream.An upstream service can reply faster if it does not wait on downstream services. Isso é especialmente útil numa arquitetura de microsserviços.This is especially useful in a microservices architecture. Se houver uma cadeia de dependências de serviço (chamadas de serviço A B, que chama o C e assim por diante), aguardando chamadas síncronas pode adicionar inaceitáveis quantidades de latência.If there is a chain of service dependencies (service A calls B, which calls C, and so on), waiting on synchronous calls can add unacceptable amounts of latency.

  • Nivelamento de carga.Load leveling. Uma fila pode atuar como uma memória intermédia para redistribuir a carga de trabalho, para que os recetores podem processar mensagens à sua própria taxa.A queue can act as a buffer to level the workload, so that receivers can process messages at their own rate.

  • Fluxos de trabalho.Workflows. Filas podem ser utilizadas para gerir um fluxo de trabalho, ao apontar verificação de mensagem após cada passo no fluxo de trabalho.Queues can be used to manage a workflow, by check-pointing the message after each step in the workflow.

No entanto, também existem alguns desafios para através de mensagens assíncronas com eficiência.However, there are also some challenges to using asynchronous messaging effectively.

  • O acoplamento com a infraestrutura de mensagens.Coupling with the messaging infrastructure. Usar uma infraestrutura de mensagens específica pode provocar o acoplamento forte, com essa infraestrutura.Using a particular messaging infrastructure may cause tight coupling with that infrastructure. É difícil mudar para outra infraestrutura de mensagens mais tarde.It will be difficult to switch to another messaging infrastructure later.

  • Latência.Latency. Latência de ponto-a-ponto para uma operação pode se tornar elevada se preencher as filas de mensagens.End-to-end latency for an operation may become high if the message queues fill up.

  • Custo.Cost. Em taxas de transferência elevadas, o custo monetário da infraestrutura de mensagens pode ser significativo.At high throughputs, the monetary cost of the messaging infrastructure could be significant.

  • Complexidade.Complexity. Processamento de mensagens assíncronas não é uma tarefa trivial.Handling asynchronous messaging is not a trivial task. Por exemplo, tem de processar mensagens duplicadas, duplicando anular ou fazendo operações idempotentes.For example, you must handle duplicated messages, either by de-duplicating or by making operations idempotent. Também é difícil implementar a semântica de solicitação-resposta através de mensagens assíncronas.It's also hard to implement request-response semantics using asynchronous messaging. Para enviar uma resposta, precisa outra fila, além de uma forma para correlacionar mensagens de solicitação e resposta.To send a response, you need another queue, plus a way to correlate request and response messages.

  • Débito.Throughput. Se necessitam de mensagens semântica da fila, a fila pode se tornar um estrangulamento no sistema.If messages require queue semantics, the queue can become a bottleneck in the system. Cada mensagem requer a operação, pelo menos, uma fila e um remover da fila a operação.Each message requires at least one queue operation and one dequeue operation. Além disso, a semântica de fila geralmente exige algum tipo de bloqueio dentro da infra-estrutura de mensagens.Moreover, queue semantics generally require some kind of locking inside the messaging infrastructure. Se a fila é um serviço gerido, pode haver latência adicional, porque a fila é externa à rede de virtual do cluster.If the queue is a managed service, there may be additional latency, because the queue is external to the cluster's virtual network. Pode reduzir esses problemas por mensagens de criação de batches, mas isso complica o código.You can mitigate these issues by batching messages, but that complicates the code. Se as mensagens não necessitam de semântica de fila, poderá usar um evento stream em vez de uma fila.If the messages don't require queue semantics, you might be able to use an event stream instead of a queue. Para obter mais informações, consulte estilo de arquitetura condicionada por eventos.For more information, see Event-driven architectural style.

Entrega por drone: Escolher os padrões de mensagensDrone Delivery: Choosing the messaging patterns

Com estas considerações em mente, a equipe de desenvolvimento efetuadas as seguintes opções de design para a aplicação de entrega por DroneWith these considerations in mind, the development team made the following design choices for the Drone Delivery application

  • O serviço de ingestão expõe uma API de REST pública que aplicações cliente utilizam para agendar, atualizar ou Cancelar entregas.The Ingestion service exposes a public REST API that client applications use to schedule, update, or cancel deliveries.

  • O serviço de ingestão utiliza os Hubs de eventos para enviar mensagens assíncronas para o serviço de Scheduler.The Ingestion service uses Event Hubs to send asynchronous messages to the Scheduler service. Mensagens assíncronas são necessárias para implementar o-nivelamento de carga que é necessário para ingestão.Asynchronous messages are necessary to implement the load-leveling that is required for ingestion. Para obter detalhes sobre como os serviços de ingestão e o agendador interagem, consulte ingestão e fluxo de trabalho.For details on how the Ingestion and Scheduler services interact, see Ingestion and workflow.

  • Os conta, a entrega, pacote, Drone e transporte de terceiros todos os serviços expõem APIs de REST internas.The Account, Delivery, Package, Drone, and Third-party Transport services all expose internal REST APIs. O serviço de agendador chama essas APIs para a realização de um pedido de utilizador.The Scheduler service calls these APIs to carry out a user request. Um motivo para usar APIs síncronas é que o Scheduler necessita de obter uma resposta de cada um dos serviços downstream.One reason to use synchronous APIs is that the Scheduler needs to get a response from each of the downstream services. Uma falha em qualquer um dos serviços downstream significa que toda a operação falhou.A failure in any of the downstream services means the entire operation failed. No entanto, um problema em potencial é a quantidade de latência que é apresentada ao chamar os serviços de back-end.However, a potential issue is the amount of latency that is introduced by calling the backend services.

  • Se a qualquer serviço downstream tiver uma falha não transitórias, toda a transação deve ser marcada como falhado.If any downstream service has a non-transient failure, the entire transaction should be marked as failed. Para lidar com esse caso, o serviço do agendador envia uma mensagem assíncrona para o Supervisor, para que o Supervisor pode agendar transações de compensação, conforme descrito no capítulo [ingestão e fluxo de trabalho] ingestion-workflow.To handle this case, the Scheduler service sends an asynchronous message to the Supervisor, so that the Supervisor can schedule compensating transactions, as described in the chapter Ingestion and workflow.

  • O serviço de entrega expõe uma API pública que os clientes podem utilizar para obter o estado de uma entrega.The Delivery service exposes a public API that clients can use to get the status of a delivery. No capítulo gateway de API, vamos discutir como um gateway de API pode ocultar os serviços subjacentes do cliente, para que o cliente não precisa saber quais os serviços expõem os APIs.In the chapter API gateway, we discuss how an API gateway can hide the underlying services from the client, so the client doesn't need to know which services expose which APIs.

  • Embora seja um drone em trânsito, o serviço de Drones envia eventos que contêm a localização do drone de atual e o estado.While a drone is in flight, the Drone service sends events that contain the drone's current location and status. O serviço de entrega escuta a esses eventos para controlar o estado de uma entrega.The Delivery service listens to these events in order to track the status of a delivery.

  • Quando o estado de uma entrega mudar, o serviço de entrega envia um evento de estado de entrega, como DeliveryCreated ou DeliveryCompleted.When the status of a delivery changes, the Delivery service sends a delivery status event, such as DeliveryCreated or DeliveryCompleted. Qualquer serviço pode subscrever a esses eventos.Any service can subscribe to these events. Na estrutura atual, o serviço de entrega é apenas subscritor, mas pode haver outros subscritores mais tarde.In the current design, the Delivery service is the only subscriber, but there might be other subscribers later. Por exemplo, os eventos podem ir para um serviço de análise em tempo real.For example, the events might go to a real-time analytics service. E como o agendador não tem de aguardar uma resposta, adicionar subscritores mais não afeta o caminho do fluxo de trabalho principal.And because the Scheduler doesn't have to wait for a response, adding more subscribers doesn't affect the main workflow path.

Diagrama de comunicação de drones

Tenha em atenção que os eventos de status de entrega são derivados de eventos de localização do drone.Notice that delivery status events are derived from drone location events. Por exemplo, quando um drone atinge um local de entrega e solta desativar um pacote, o serviço de entrega se traduz isso num evento de DeliveryCompleted.For example, when a drone reaches a delivery location and drops off a package, the Delivery service translates this into a DeliveryCompleted event. Este é um exemplo de pensar em termos do modelos de domínio.This is an example of thinking in terms of domain models. Conforme descrito anteriormente, gestão de Drones pertence a um contexto vinculado separado.As described earlier, Drone Management belongs in a separate bounded context. Os eventos de drones transmitem o local físico de um drone.The drone events convey the physical location of a drone. Os eventos de entrega, por outro lado, representam as alterações no estado de uma entrega, o que é uma entidade de negócio diferentes.The delivery events, on the other hand, represent changes in the status of a delivery, which is a different business entity.

Usando uma malha de serviçoUsing a service mesh

R malha do serviço é uma camada de software que lida com comunicação de serviço para serviço.A service mesh is a software layer that handles service-to-service communication. As malhas de serviço foram concebidas para resolver muitos dos problemas listados na secção anterior e para mover a responsabilidade para essas preocupações afastar os microsserviços propriamente ditas e uma camada partilhada.Service meshes are designed to address many of the concerns listed in the previous section, and to move responsibility for these concerns away from the microservices themselves and into a shared layer. A malha de serviço atua como um proxy que intercepte a comunicação de rede entre os microsserviços no cluster.The service mesh acts as a proxy that intercepts network communication between microservices in the cluster.

Nota

Malha de serviço é um exemplo do padrão de Ambassador — um serviço de programa auxiliar que envia pedidos de rede em nome do aplicativo.Service mesh is an example of the Ambassador pattern — a helper service that sends network requests on behalf of the application.

Neste momento, as opções principais para uma malha de serviço no Kubernetes são linkerd e Istio.Right now, the main options for a service mesh in Kubernetes are linkerd and Istio. Essas tecnologias estão a evoluir rapidamente.Both of these technologies are evolving rapidly. No entanto, algumas funcionalidades que linkerd e Istio têm em comum incluem:However, some features that both linkerd and Istio have in common include:

  • O balanceamento de carga ao nível da sessão, com base em latências observadas ou número de pedidos pendentes.Load balancing at the session level, based on observed latencies or number of outstanding requests. Isso pode melhorar o desempenho no balanceamento de carga de camada 4 fornecido pelo Kubernetes.This can improve performance over the layer-4 load balancing that is provided by Kubernetes.

  • Encaminhamento de camada 7 com base no caminho do URL, no cabeçalho de anfitrião, a versão de API ou outras regras ao nível da aplicação.Layer-7 routing based on URL path, Host header, API version, or other application-level rules.

  • Repetição de pedidos falhados.Retry of failed requests. Uma malha de serviço compreende os códigos de erro HTTP e pode repetir automaticamente os pedidos falhados.A service mesh understands HTTP error codes, and can automatically retry failed requests. Pode configurar esse número máximo de repetições, juntamente com um período de tempo limite para vinculado a latência máxima.You can configure that maximum number of retries, along with a timeout period in order to bound the maximum latency.

  • Disjunção automática.Circuit breaking. Se uma instância falhar consistentemente pedidos, a malha de serviço será temporariamente marque-a como indisponível.If an instance consistently fails requests, the service mesh will temporarily mark it as unavailable. Após um período de término, irá tentar novamente a instância.After a backoff period, it will try the instance again. Pode configurar o disjuntor automático com base em vários critérios, como o número de falhas consecutivas,You can configure the circuit breaker based on various criteria, such as the number of consecutive failures,

  • Malha de serviço captura as métricas sobre originar chamadas, como o volume de pedidos, latência, taxas de erro e o sucesso e tamanhos de resposta.Service mesh captures metrics about interservice calls, such as the request volume, latency, error and success rates, and response sizes. A malha de serviço também permite que o rastreio distribuído ao adicionar informações de correlação para cada salto num pedido.The service mesh also enables distributed tracing by adding correlation information for each hop in a request.

  • Autenticação mútua de TLS para chamadas de serviço para serviço.Mutual TLS Authentication for service-to-service calls.

Precisa de uma malha de serviço?Do you need a service mesh? O valor que adicionarem a um sistema distribuído é certamente atrativo.The value they add to a distributed system is certainly compelling. Se não tiver uma malha de serviço, terá de considerar cada um dos desafios mencionados no início do capítulo.If you don't have a service mesh, you will need to consider each of the challenges mentioned at the beginning of the chapter. Pode resolver problemas, como repetição, o disjuntor automático e o rastreio distribuído sem uma malha de serviço, mas essas preocupações dos serviços individuais e uma camada dedicado se move de uma malha de serviço.You can solve problems like retry, circuit breaker, and distributed tracing without a service mesh, but a service mesh moves these concerns out of the individual services and into a dedicated layer. Por outro lado, as malhas de serviço são uma tecnologia relativamente nova que ainda está em desenvolvimento.On the other hand, service meshes are a relatively new technology that is still maturing. Implementar uma malha de serviço adiciona complexidade para a definição e configuração do cluster.Deploying a service mesh adds complexity to the setup and configuration of the cluster. Pode haver implicações de desempenho, como pedidos agora são roteados através do proxy de malha do serviço, e Extras serviços estão agora em execução em cada nó no cluster.There may be performance implications, because requests now get routed through the service mesh proxy, and because extra services are now running on every node in the cluster. Deve fazer o desempenho completo teste de carga e antes de implementar uma malha de serviço na produção.You should do thorough performance and load testing before deploying a service mesh in production.