Estruturar microsserviços: Identificar os limites do microsserviçoDesigning microservices: Identifying microservice boundaries

O que é o tamanho correto para um microsserviço?What is the right size for a microservice? Ouvirá com frequência algo para o efeito de "demasiado grande e demasiado pequeno" — e embora isso seja certamente correto, não é muito útil na prática.You often hear something to the effect of, "not too big and not too small" — and while that's certainly correct, it's not very helpful in practice. Mas se iniciar a partir de um modelo de domínio cuidadosamente desenvolvido, é muito mais fácil de ponderar sobre microsserviços.But if you start from a carefully designed domain model, it's much easier to reason about microservices.

Diagrama de contextos limitados

Modelo de domínio para os microsserviçosFrom domain model to microservices

Na capítulo anterior, definimos um conjunto de contextos limitados para a aplicação de entrega por Drone.In the previous chapter, we defined a set of bounded contexts for the Drone Delivery application. Iremos parecia mais detalhadamente em um desses contextos limitados, o contexto de envio limitado e identificou um conjunto de entidades, agregações, e serviços de domínio para que determinado contexto.Then we looked more closely at one of these bounded contexts, the Shipping bounded context, and identified a set of entities, aggregates, and domain services for that bounded context.

Agora, estamos prontos para passar do modelo de domínio para o design do aplicativo.Now we're ready to go from domain model to application design. Aqui está uma abordagem que pode usar para derivar microsserviços de modelo de domínio.Here's an approach that you can use to derive microservices from the domain model.

  1. Comece com um contexto vinculado.Start with a bounded context. Em geral, a funcionalidade num microsserviço não deve abranger mais de um contexto vinculado.In general, the functionality in a microservice should not span more than one bounded context. Por definição, um contexto vinculado marca o limite de um modelo de domínio específico.By definition, a bounded context marks the boundary of a particular domain model. Se encontrar um microsserviço mistura modelos de domínio diferentes em conjunto, que é um sinal de que poderá ter de voltar atrás e refinar a sua análise do domínio.If you find that a microservice mixes different domain models together, that's a sign that you may need to go back and refine your domain analysis.

  2. Em seguida, observe as agregações existentes no seu modelo de domínio.Next, look at the aggregates in your domain model. Agregações geralmente são bons candidatos para microsserviços.Aggregates are often good candidates for microservices. Um agregado bem projetado exibe muitas das características de um microsserviço bem projetado, tais como:A well-designed aggregate exhibits many of the characteristics of a well-designed microservice, such as:

    • Um agregado é derivado de requisitos comerciais, em vez de com questões técnicas, como acesso a dados ou de mensagens.An aggregate is derived from business requirements, rather than technical concerns such as data access or messaging.
    • Um agregado deve ter uma coesão altamente funcional.An aggregate should have high functional cohesion.
    • Um agregado é um limite de persistência.An aggregate is a boundary of persistence.
    • Agregações devem sejam menos rígidas.Aggregates should be loosely coupled.
  3. Serviços de domínio também são bons candidatos para microsserviços.Domain services are also good candidates for microservices. Serviços de domínio são operações sem monitoração de estado em várias agregações.Domain services are stateless operations across multiple aggregates. Um exemplo típico é um fluxo de trabalho que envolve várias microsserviços.A typical example is a workflow that involves several microservices. Vamos ver um exemplo na aplicação entrega por Drone.We'll see an example of this in the Drone Delivery application.

  4. Finalmente, considere os requisitos não funcionais.Finally, consider non-functional requirements. Examinar os fatores como o tamanho da Equipe, tipos de dados, as tecnologias, os requisitos de escalabilidade, requisitos de disponibilidade e requisitos de segurança.Look at factors such as team size, data types, technologies, scalability requirements, availability requirements, and security requirements. Esses fatores podem levar a ainda mais decompor um microsserviço em duas ou mais serviços mais pequenos, ou fazer o oposto e combinar vários microsserviços num só.These factors may lead you to further decompose a microservice into two or more smaller services, or do the opposite and combine several microservices into one.

Depois de identificar os microsserviços em seu aplicativo, valide seu design contra os seguintes critérios:After you identify the microservices in your application, validate your design against the following criteria:

  • Cada serviço tem uma única responsabilidade.Each service has a single responsibility.
  • Não há nenhuma chamada chatty entre serviços.There are no chatty calls between services. Se a divisão de funcionalidade em dois serviços faz com que eles será bem informal, poderá ser um sintoma de que essas funções pertencem no mesmo serviço.If splitting functionality into two services causes them to be overly chatty, it may be a symptom that these functions belong in the same service.
  • Cada serviço é pequeno o bastante para que ele pode ser criado por uma equipe pequena trabalhar de forma independente.Each service is small enough that it can be built by a small team working independently.
  • Não há nenhuma dependência entre que exigirá dois ou mais serviços a serem implantados no passo de bloqueio.There are no inter-dependencies that will require two or more services to be deployed in lock-step. Deve sempre ser possível implementar um serviço sem implementar novamente quaisquer outros serviços.It should always be possible to deploy a service without redeploying any other services.
  • Os serviços não sejam rigidamente integrados e podem evoluir de forma independente.Services are not tightly coupled, and can evolve independently.
  • Seus limites de serviço não irão criar problemas com consistência de dados ou integridade.Your service boundaries will not create problems with data consistency or integrity. Por vezes, é importante manter a consistência de dados por colocar a funcionalidade num único microsserviço.Sometimes it's important to maintain data consistency by putting functionality into a single microservice. Dito isso, considere se precisa realmente consistência forte.That said, consider whether you really need strong consistency. Existem estratégias para lidar com a consistência eventual num sistema distribuído, e os benefícios de decomposição de serviços, muitas vezes, superam os desafios de gerenciar a consistência eventual.There are strategies for addressing eventual consistency in a distributed system, and the benefits of decomposing services often outweigh the challenges of managing eventual consistency.

Acima de tudo, é importante ser pragmático e lembre-se de que o design controlado por domínio é um processo iterativo.Above all, it's important to be pragmatic, and remember that domain-driven design is an iterative process. Em caso de dúvida, comece com os microsserviços de alta granularidade mais.When in doubt, start with more coarse-grained microservices. A divisão de um microsserviço em dois serviços menores é mais fácil do que a funcionalidade de refatoração em vários microsserviços existentes.Splitting a microservice into two smaller services is easier than refactoring functionality across several existing microservices.

Entrega por drone: Definir os microsserviçosDrone Delivery: Defining the microservices

Lembre-se de que a equipe de desenvolvimento identifiquei as agregações de quatro — entrega, o pacote, Drone e conta — e dois serviços de domínio, o agendador e Supervisor.Recall that the development team had identified the four aggregates — Delivery, Package, Drone, and Account — and two domain services, Scheduler and Supervisor.

Entrega e pacote são candidatos óbvios para microsserviços.Delivery and Package are obvious candidates for microservices. O agendador e o Supervisor coordenam as atividades realizadas por outros microsserviços, por isso faz sentido para implementar estes serviços de domínio como microsserviços.The Scheduler and Supervisor coordinate the activities performed by other microservices, so it makes sense to implement these domain services as microservices.

Drone e conta são interessantes porque pertencem a outros contextos limitados.Drone and Account are interesting because they belong to other bounded contexts. Uma opção é para o Scheduler chamar Drone e conta vinculadas contextos diretamente.One option is for the Scheduler to call the Drone and Account bounded contexts directly. Outra opção é criar microsserviços Drone e conta dentro do contexto de envio limitado.Another option is to create Drone and Account microservices inside the Shipping bounded context. Estes microsserviços seriam mediar entre contextos limitados, expondo os esquemas de dados ou de APIs que são mais adequadas para o contexto de envio.These microservices would mediate between the bounded contexts, by exposing APIs or data schemas that are more suited to the Shipping context.

Os detalhes da Drone e consistência da conta são os contextos além do escopo desta orientação, pelo que criámos fictícios serviços para os mesmos em nossa implementação de referência.The details of the Drone and Account bounded contexts are beyond the scope of this guidance, so we created mock services for them in our reference implementation. Mas aqui estão alguns fatores a considerar nesta situação:But here are some factors to consider in this situation:

  • O que é a sobrecarga de rede de chamar diretamente o outro contexto vinculado?What is the network overhead of calling directly into the other bounded context?

  • É o esquema de dados adequado para este contexto para o outro contexto vinculado ou é melhor ter um esquema que é adaptado para este contexto vinculado?Is the data schema for the other bounded context suitable for this context, or is it better to have a schema that's tailored to this bounded context?

  • É o outro contexto vinculado um sistema herdado?Is the other bounded context a legacy system? Se, por isso, poderá criar um serviço que age como um camada anti-corrupção traduzir entre o sistema legado e a aplicação moderna.If so, you might create a service that acts as an anti-corruption layer to translate between the legacy system and the modern application.

  • O que é a estrutura de equipe?What is the team structure? É fácil de se comunicar com a equipe responsável por contexto vinculado?Is it easy to communicate with the team that's responsible for the other bounded context? Caso contrário, a criação de um serviço que Media a entre os dois contextos pode ajudar a reduzir o custo de comunicação entre equipes.If not, creating a service that mediates between the two contexts can help to mitigate the cost of cross-team communication.

Até agora, podemos ainda não tiver considerado quaisquer requisitos não funcionais.So far, we haven't considered any non-functional requirements. Pensando sobre os requisitos de débito da aplicação, a equipe de desenvolvimento decidiu criar um microsserviço de ingestão separado que é responsável por ingestão de pedidos de cliente.Thinking about the application's throughput requirements, the development team decided to create a separate Ingestion microservice that is responsible for ingesting client requests. Este microsserviços implementará nivelamento de carga ao colocar os pedidos recebidos para um buffer para processamento.This microservice will implement load leveling by putting incoming requests into a buffer for processing. O agendador será os pedidos de leitura do buffer e executar o fluxo de trabalho.The Scheduler will read the requests from the buffer and execute the workflow.

Requisitos não funcionais levaram a equipe de criar um serviço adicional.Non-functional requirements led the team to create one additional service. Todos os serviços até agora tem sido sobre o processo de agendamento e a entrega de pacotes em tempo real.All of the services so far have been about the process of scheduling and delivering packages in real time. Mas o sistema também precisa de armazenar o histórico de cada entrega no armazenamento de longo prazo para análise de dados.But the system also needs to store the history of every delivery in long-term storage for data analysis. A equipe considerado tornando isso a responsabilidade do serviço de entrega.The team considered making this the responsibility of the Delivery service. No entanto, os requisitos de armazenamento de dados são bastante diferentes para análise histórica versus operações em trânsito (consulte considerações sobre dados).However, the data storage requirements are quite different for historical analysis versus in-flight operations (see Data considerations). Por conseguinte, a equipe decidiu criar um serviço de histórico de entrega separado, que irá escutar eventos de DeliveryTracking do serviço de entrega e escrever os eventos no armazenamento de longo prazo.Therefore, the team decided to create a separate Delivery History service, which will listen for DeliveryTracking events from the Delivery service and write the events into long-term storage.

O diagrama seguinte mostra o design neste momento:The following diagram shows the design at this point:

Diagrama de design

Escolher uma opção de computaçãoChoosing a compute option

O termo computação refere-se ao modelo de alojamento dos recursos de computação em que a aplicação é executada.The term compute refers to the hosting model for the computing resources that your application runs on. Para uma arquitetura de microsserviços, as duas abordagens são especialmente populares:For a microservices architecture, two approaches are especially popular:

  • Um orquestrador de serviço que gerencia serviços em execução em nós dedicado (VMs).A service orchestrator that manages services running on dedicated nodes (VMs).
  • Uma arquitetura sem servidor com as funções como um serviço (FaaS).A serverless architecture using functions as a service (FaaS).

Embora essas não são as únicas opções, são ambas as abordagens comprovadas para a criação de microsserviços.While these aren't the only options, they are both proven approaches to building microservices. Uma aplicação pode incluir as duas abordagens.An application might include both approaches.

Orquestradores de serviçoService orchestrators

Um orquestrador manipula tarefas relacionadas com a implementação e gestão de um conjunto de serviços.An orchestrator handles tasks related to deploying and managing a set of services. Estas tarefas incluem a colocar os serviços em nós, o estado de funcionamento dos serviços, reiniciar os serviços de mau estado de funcionamento de monitorização, tráfego de rede de balanceamento de carga em instâncias de serviço, a deteção do serviço, dimensionar o número de instâncias de um serviço e a aplicação atualizações de configuração.These tasks include placing services on nodes, monitoring the health of services, restarting unhealthy services, load balancing network traffic across service instances, service discovery, scaling the number of instances of a service, and applying configuration updates. Orquestradores populares incluem o Kubernetes, Service Fabric, DC/OS e Docker Swarm.Popular orchestrators include Kubernetes, Service Fabric, DC/OS, and Docker Swarm.

Na plataforma do Azure, considere as seguintes opções:On the Azure platform, consider the following options:

  • Serviço Kubernetes do Azure (AKS) é um serviço de Kubernetes gerido.Azure Kubernetes Service (AKS) is a managed Kubernetes service. Provisões de AKS Kubernetes e expõe os pontos finais de API do Kubernetes, mas hospeda e gerencia o plano de controlo do Kubernetes, efetuar as atualizações automatizadas, automatizados de aplicação de patches, dimensionamento automático e outras tarefas de gestão.AKS provisions Kubernetes and exposes the Kubernetes API endpoints, but hosts and manages the Kubernetes control plane, performing automated upgrades, automated patching, autoscaling, and other management tasks. Pode pensar AKS como sendo "APIs do Kubernetes como um serviço".You can think of AKS as being "Kubernetes APIs as a service."

  • Service Fabric é uma plataforma de sistemas distribuídos para o empacotamento, implementação e gestão de microsserviços.Service Fabric is a distributed systems platform for packaging, deploying, and managing microservices. Microsserviços podem ser implementados no Service Fabric, como contentores, como binários executáveis ou como Reliable Services.Microservices can be deployed to Service Fabric as containers, as binary executables, or as Reliable Services. Usando o modelo de programação Reliable Services, serviços podem utilizar diretamente APIs para consultar o sistema, o estado de funcionamento do relatório, receber notificações sobre a configuração e alterações de código e descobrir outros serviços de programação do Service Fabric.Using the Reliable Services programming model, services can directly use Service Fabric programming APIs to query the system, report health, receive notifications about configuration and code changes, and discover other services. Das principais diferenciações do Service Fabric é que se concentra na criação de serviços com estado usando Reliable Collections.A key differentiation with Service Fabric is its strong focus on building stateful services using Reliable Collections.

  • O Azure Container Service (ACS) é um serviço do Azure que permite-lhe implementar um cluster de DC/OS, Docker Swarm ou Kubernetes pronto para produção.Azure Container Service (ACS) is an Azure service that lets you deploy a production-ready DC/OS, Docker Swarm, or Kubernetes cluster.

    Nota

    Embora o Kubernetes é suportado pelo ACS, recomendamos AKS para executar o Kubernetes no Azure.Although Kubernetes is supported by ACS, we recommended AKS for running Kubernetes on Azure. AKS fornece recursos aprimorados de gerenciamento e os benefícios de custo.AKS provides enhanced management capabilities and cost benefits.

ContentoresContainers

Por vezes, as pessoas falam sobre contentores e microsserviços como se estivessem a mesma coisa.Sometimes people talk about containers and microservices as if they were the same thing. Enquanto que não é verdade — não tem contentores para criar microsserviços — os contentores têm alguns benefícios que são especialmente relevantes para microsserviços, tais como:While that's not true — you don't need containers to build microservices — containers do have some benefits that are particularly relevant to microservices, such as:

  • Portabilidade.Portability. Uma imagem de contentor é um pacote autônomo, que é executado sem a necessidade de instalar bibliotecas ou outras dependências.A container image is a standalone package that runs without needing to install libraries or other dependencies. Isso as torna fácil de implantar.That makes them easy to deploy. Contentores podem ser iniciados e parados rapidamente, para que pode acelerar a novas instâncias para processar a carga mais ou para recuperar de falhas de nó.Containers can be started and stopped quickly, so you can spin up new instances to handle more load or to recover from node failures.

  • Densidade.Density. Os contentores são simples em comparação com a execução de uma máquina virtual, porque elas compartilham recursos do sistema operacional.Containers are lightweight compared with running a virtual machine, because they share OS resources. Que torna possível empacotar vários contentores num único nó, o que é especialmente útil quando o aplicativo consiste em vários serviços pequenos.That makes it possible to pack multiple containers onto a single node, which is especially useful when the application consists of many small services.

  • Isolamento de recursos.Resource isolation. Pode limitar a quantidade de memória e CPU que está disponível para um contentor, que pode ajudar a garantir que um processo de fuga não esgotar os recursos de anfitrião.You can limit the amount of memory and CPU that is available to a container, which can help to ensure that a runaway process doesn't exhaust the host resources. Consulte a padrão de Bulkhead para obter mais informações.See the Bulkhead pattern for more information.

(As funções sem servidor como um serviço)Serverless (Functions as a Service)

Com um sem servidor arquitetura, não gerencia as VMs ou a infraestrutura de rede virtual.With a serverless architecture, you don't manage the VMs or the virtual network infrastructure. Em vez disso, vai implementar código e os identificadores de serviço alojamento colocar esse código numa VM e executá-la.Instead, you deploy code and the hosting service handles putting that code onto a VM and executing it. Essa abordagem tende a favorecer pequenas funções granulares que são coordenadas com acionadores baseados em eventos.This approach tends to favor small granular functions that are coordinated using event-based triggers. Por exemplo, uma mensagem a ser colocada na fila pode disparar uma função que lê da fila e processa a mensagem.For example, a message being placed onto a queue might trigger a function that reads from the queue and processes the message.

[As funções do Azure] functions é um serviço de computação sem servidor que oferece suporte a vários acionadores de função, incluindo pedidos de HTTP, filas do Service Bus e eventos de Hubs de eventos.Azure Functions is a serverless compute service that supports various function triggers, including HTTP requests, Service Bus queues, and Event Hubs events. Para obter uma lista completa, consulte acionadores de funções do Azure e conceitos de enlaces.For a complete list, see Azure Functions triggers and bindings concepts. Também considere Azure Event Grid, que é um serviço de encaminhamento de eventos gerido no Azure.Also consider Azure Event Grid, which is a managed event routing service in Azure.

Orchestrator ou sem servidor?Orchestrator or serverless?

Eis alguns fatores a considerar ao escolher entre uma abordagem do orchestrator e uma abordagem sem servidor.Here are some factors to consider when choosing between an orchestrator approach and a serverless approach.

Capacidade de gerenciamento uma aplicação sem servidor é fácil de gerenciar, porque a plataforma gerencia todos os de recursos de computação para.Manageability A serverless application is easy to manage, because the platform manages all the of compute resources for you. Embora um orquestrador abstrai alguns aspectos do gerenciamento e a configuração de um cluster, não oculta completamente as VMs subjacentes.While an orchestrator abstracts some aspects of managing and configuring a cluster, it does not completely hide the underlying VMs. Com um orquestrador, terá de pensar sobre problemas, tais como o balanceamento de carga, utilização de CPU e memória e de rede.With an orchestrator, you will need to think about issues such as load balancing, CPU and memory usage, and networking.

Flexibilidade e controle.Flexibility and control. Um orquestrador dá-lhe uma grande quantidade de controle sobre configurar e gerir os seus serviços e o cluster.An orchestrator gives you a great deal of control over configuring and managing your services and the cluster. O compromisso é a complexidade adicional.The tradeoff is additional complexity. Com uma arquitetura sem servidor, abrirá mão de algum grau de controle uma vez que estes detalhes serem abstraídos.With a serverless architecture, you give up some degree of control because these details are abstracted.

Portabilidade.Portability. Todos os orquestradores listados aqui (Kubernetes, DC/OS, Docker Swarm e o Service Fabric) podem ser executados no local ou em várias clouds públicas.All of the orchestrators listed here (Kubernetes, DC/OS, Docker Swarm, and Service Fabric) can run on-premises or in multiple public clouds.

Integração de aplicações.Application integration. Ele pode ser um desafio para criar um aplicativo complexo usando uma arquitetura sem servidor.It can be challenging to build a complex application using a serverless architecture. Uma opção no Azure é usar do Azure Logic Apps para coordenar um conjunto de funções do Azure.One option in Azure is to use Azure Logic Apps to coordinate a set of Azure Functions. Para obter um exemplo desta abordagem, consulte criar uma função que se integra no Azure Logic Apps.For an example of this approach, see Create a function that integrates with Azure Logic Apps.

Custo.Cost. Com um orquestrador, paga para as VMs que estão em execução no cluster.With an orchestrator, you pay for the VMs that are running in the cluster. Com uma aplicação sem servidor, paga apenas os recursos de computação reais consumidos.With a serverless application, you pay only for the actual compute resources consumed. Em ambos os casos, terá de avaliar o custo de quaisquer serviços adicionais, como o armazenamento, bases de dados e serviços de mensagens.In both cases, you need to factor in the cost of any additional services, such as storage, databases, and messaging services.

Escalabilidade.Scalability. As funções do Azure é dimensionado automaticamente para satisfazer a procura, com base no número de eventos de entrada.Azure Functions scales automatically to meet demand, based on the number of incoming events. Com um orquestrador, pode aumentar horizontalmente ao aumento do número de instâncias de serviço em execução no cluster.With an orchestrator, you can scale out by increasing the number of service instances running in the cluster. Também pode dimensionar ao adicionar VMs adicionais ao cluster.You can also scale by adding additional VMs to the cluster.

Nossa implementação de referência usa principalmente o Kubernetes, mas nós usamos as funções do Azure para um serviço, ou seja, o serviço de histórico de entrega.Our reference implementation primarily uses Kubernetes, but we did use Azure Functions for one service, namely the Delivery History service. As funções do Azure foi uma boa opção para esse serviço específico, porque está é uma carga de trabalho desencadeados por eventos.Azure Functions was a good fit for this particular service, because it's is an event-driven workload. Ao utilizar um acionador de Hubs de eventos para invocar a função, o serviço necessário uma quantidade mínima de código.By using an Event Hubs trigger to invoke the function, the service needed a minimal amount of code. Além disso, o serviço de entrega histórico não é parte do fluxo de trabalho principal, para que executá-lo fora do cluster do Kubernetes, não afeta a latência de ponto a ponto das operações iniciadas pelo usuário.Also, the Delivery History service is not part of the main workflow, so running it outside of the Kubernetes cluster doesn't affect the end-to-end latency of user-initiated operations.