Estrutura para evoluçãoDesign for evolution

Uma conceção evolutiva é a chave para a inovação contínuaAn evolutionary design is key for continuous innovation

Todas as aplicações bem sucedidas mudam ao longo do tempo, quer seja para corrigir erros, adicionar novas funcionalidades, incorporar novas tecnologias ou tornar os esquemas existentes mais dimensionáveis e resilientes.All successful applications change over time, whether to fix bugs, add new features, bring in new technologies, or make existing systems more scalable and resilient. Se todas as partes de uma aplicação estiverem fortemente conjugadas, torna-se muito difícil introduzir as alterações no sistema.If all the parts of an application are tightly coupled, it becomes very hard to introduce changes into the system. A alteração de uma parte da aplicação pode interromper outra parte ou fazer com que as alterações oscilem por toda a base de código.A change in one part of the application may break another part, or cause changes to ripple through the entire codebase.

Este problema não se limita às aplicações monolíticas.This problem is not limited to monolithic applications. Uma aplicação pode estar decomposta em serviços, mas continuar a apresentar o tipo de acoplamento forte que faz com que o sistema fique rígido e frágil.An application can be decomposed into services, but still exhibit the sort of tight coupling that leaves the system rigid and brittle. Mas, quando os serviços são concebidos para evoluir, as equipas podem inovar e fornecer continuamente novas funcionalidades.But when services are designed to evolve, teams can innovate and continuously deliver new features.

Microsserviços estão se tornando uma forma popular conseguir uma conceção evolutiva, pois abordam muitas das considerações aqui listadas.Microservices are becoming a popular way to achieve an evolutionary design, because they address many of the considerations listed here.

RecomendaçõesRecommendations

Imponha coesão elevada e acoplamento alargado.Enforce high cohesion and loose coupling. Um serviço é coeso se fornecer funcionalidades que estão interligadas logicamente.A service is cohesive if it provides functionality that logically belongs together. Os serviços são relativamente acoplados se for possível alterar um serviço sem alterar o outro.Services are loosely coupled if you can change one service without changing the other. A coesão elevada, geralmente, significa que as alterações numa função irão exigir alterações nas outras funções relacionadas.High cohesion generally means that changes in one function will require changes in other related functions. Se chegar à conclusão que atualizar um serviço requer atualizações coordenadas de outros serviços, poderá ser um sinal de que os serviços não são coesos.If you find that updating a service requires coordinated updates to other services, it may be a sign that your services are not cohesive. Uma das metas do design controlado por domínio (DDD) é identificar esses limites.One of the goals of domain-driven design (DDD) is to identify those boundaries.

Encapsule o conhecimento do domínio.Encapsulate domain knowledge. Quando um cliente consome um serviço, a responsabilidade de impor as regras de negócio do domínio não deve recair sobre o cliente.When a client consumes a service, the responsibility for enforcing the business rules of the domain should not fall on the client. Em vez disso, o serviço deve encapsular todo o conhecimento do domínio que seja da respetiva responsabilidade.Instead, the service should encapsulate all of the domain knowledge that falls under its responsibility. Caso contrário, todos os clientes têm de impor as regras de negócio e acaba por ficar com dados de conhecimento do domínio distribuídos por diferentes partes da aplicação.Otherwise, every client has to enforce the business rules, and you end up with domain knowledge spread across different parts of the application.

Utilize mensagens assíncronas.Use asynchronous messaging. As mensagens assíncronas são uma forma de separar o produtor de mensagens do consumidor.Asynchronous messaging is a way to decouple the message producer from the consumer. O produtor não depende do consumidor que responde à mensagem ou efetua qualquer ação específica.The producer does not depend on the consumer responding to the message or taking any particular action. Com uma arquitetura de pub/sub, o produtor nem sequer sabe quem está a consumir a mensagem.With a pub/sub architecture, the producer may not even know who is consuming the message. Os novos serviços podem facilmente consumir mensagens sem modificações para o produtor.New services can easily consume the messages without any modifications to the producer.

Não incorpore dados de conhecimento do domínio num gateway.Don't build domain knowledge into a gateway. Os gateways podem ser úteis numa arquitetura de microsserviços, para ações como o encaminhamento de pedidos, tradução de protocolos, balanceamento de carga ou autenticação.Gateways can be useful in a microservices architecture, for things like request routing, protocol translation, load balancing, or authentication. No entanto, o gateway deve restringir-se a este tipo de funcionalidade de infraestrutura.However, the gateway should be restricted to this sort of infrastructure functionality. Não deve implementar qualquer conhecimento de domínio, para evitar tornar-se uma dependência pesada.It should not implement any domain knowledge, to avoid becoming a heavy dependency.

Exponha interfaces abertas.Expose open interfaces. Evite criar camadas de tradução personalizadas que ficam entre serviços.Avoid creating custom translation layers that sit between services. Em vez disso, um serviço deve expor uma API com um contrato de API bem definido.Instead, a service should expose an API with a well-defined API contract. A API deve ter versão, para que possa evoluir a API, mantendo a retrocompatibilidade.The API should be versioned, so that you can evolve the API while maintaining backward compatibility. Dessa forma, pode atualizar um serviço sem coordenar as atualizações para todos os serviços a montante que dependem dele.That way, you can update a service without coordinating updates to all of the upstream services that depend on it. Os serviços destinados ao público devem expor uma API RESTful através de HTTP.Public facing services should expose a RESTful API over HTTP. Os serviços de back-end poderão utilizar um protocolo de mensagens de estilo RPC por motivos de desempenho.Backend services might use an RPC-style messaging protocol for performance reasons.

Conceba e teste os contratos de serviço.Design and test against service contracts. Quando os serviços expõem APIs bem definidas, pode desenvolver e testar essas APIs.When services expose well-defined APIs, you can develop and test against those APIs. Dessa forma, pode desenvolver e testar um serviço individual sem lançar todos os serviços dependentes.That way, you can develop and test an individual service without spinning up all of its dependent services. (Obviamente, teria na mesma de efetuar testes de integração e de carga nos serviços reais.)(Of course, you would still perform integration and load testing against the real services.)

Abstraia a infraestrutura da lógica do domínio.Abstract infrastructure away from domain logic. Não permita que a lógica do domínio se misture com funcionalidades relacionadas com a infraestrutura, como as mensagens ou a persistência.Don't let domain logic get mixed up with infrastructure-related functionality, such as messaging or persistence. Caso contrário, as alterações da lógica do domínio irão requerer atualizações das camadas de infraestrutura e vice-versa.Otherwise, changes in the domain logic will require updates to the infrastructure layers and vice versa.

Passe as questões transversais para um serviço separado.Offload cross-cutting concerns to a separate service. Por exemplo, se vários serviços tiverem de autenticar pedidos, poderia mover esta funcionalidade para o seu próprio serviço.For example, if several services need to authenticate requests, you could move this functionality into its own service. Em seguida, poderia evoluir o serviço de autenticação —, por exemplo, adicionando um novo fluxo de autenticação — sem alterar qualquer um dos serviços que o utilizam.Then you could evolve the authentication service — for example, by adding a new authentication flow — without touching any of the services that use it.

Implemente os serviços de modo independente.Deploy services independently. Quando a equipa de DevOps consegue implementar um único serviço independentemente dos outros serviços na aplicação, as atualizações podem acontecer mais rapidamente e em segurança.When the DevOps team can deploy a single service independently of other services in the application, updates can happen more quickly and safely. As correções de erros e novas funcionalidades podem ser implementadas a uma cadência mais regular.Bug fixes and new features can be rolled out at a more regular cadence. Conceba a aplicação e o processo de lançamento para que suportem atualizações independentes.Design both the application and the release process to support independent updates.