Padrão de back-ends para front-endsBackends for Frontends pattern

Crie serviços de back-end separados a serem consumidos por aplicativos de front-end específico ou interfaces.Create separate backend services to be consumed by specific frontend applications or interfaces. Esse padrão é útil quando você deseja evitar a personalização de um único back-end para várias interfaces.This pattern is useful when you want to avoid customizing a single backend for multiple interfaces. Esse padrão foi descrito pela primeira vez por Sam Newman.This pattern was first described by Sam Newman.

Contexto e problemaContext and problem

Inicialmente, um aplicativo pode ser direcionado a uma interface do usuário da Web da área de trabalho.An application may initially be targeted at a desktop web UI. Normalmente, um serviço de back-end é desenvolvido paralelamente, o que fornece os recursos necessários para essa interface do usuário.Typically, a backend service is developed in parallel that provides the features needed for that UI. À medida que a base de usuários do aplicativo aumenta, é desenvolvido um aplicativo móvel que deve interagir com o mesmo back-end.As the application's user base grows, a mobile application is developed that must interact with the same backend. O serviço de back-end se torna um back-end para fins gerais, atendendo aos requisitos de ambas as interfaces móvel e de área de trabalho.The backend service becomes a general-purpose backend, serving the requirements of both the desktop and mobile interfaces.

Mas os recursos de um dispositivo móvel são muito diferentes de um navegador de área de trabalho quanto ao tamanho da tela, ao desempenho e às limitações de exibição.But the capabilities of a mobile device differ significantly from a desktop browser, in terms of screen size, performance, and display limitations. Como resultado, os requisitos para um back-end aplicativo móvel diferem da interface do usuário da Web da área de trabalho.As a result, the requirements for a mobile application backend differ from the desktop web UI.

Essas diferenças resultam em requisitos concorrentes do back-end.These differences result in competing requirements for the backend. O back-end requer alterações regulares e significativas para atender à interface do usuário da área de trabalho da Web de e ao aplicativo móvel.The backend requires regular and significant changes to serve both the desktop web UI and the mobile application. Muitas vezes, equipes de interface separadas trabalham em cada front-end, fazendo com que o back-end vire um gargalo no processo de desenvolvimento.Often, separate interface teams work on each frontend, causing the backend to become a bottleneck in the development process. Requisitos conflitantes de atualização e a necessidade de manter o serviço funcionando para ambos os front-ends podem fazer com que se ponha muito esforço em um único recurso implantável.Conflicting update requirements, and the need to keep the service working for both frontends, can result in spending a lot of effort on a single deployable resource.

Diagrama de contexto e problema de back-ends para front-ends padrão

Como a atividade de desenvolvimento se concentra no serviço de back-end, uma equipe separada pode ser criada para gerenciar e manter o back-end.As the development activity focuses on the backend service, a separate team may be created to manage and maintain the backend. Por fim, isso resulta em uma desconexão entre as equipes de desenvolvimento de interface e de back-end, sobrecarregando a equipe de back-end para equilibrar os requisitos concorrentes das diferentes equipes da interface do usuário.Ultimately, this results in a disconnect between the interface and backend development teams, placing a burden on the backend team to balance the competing requirements of the different UI teams. Quando uma equipe da interface precisa de alterações no back-end, essas alterações devem ser validadas com outras equipes da interface antes de serem integradas no back-end.When one interface team requires changes to the backend, those changes must be validated with other interface teams before they can be integrated into the backend.

SoluçãoSolution

Crie um back-end por interface do usuário.Create one backend per user interface. Ajuste o comportamento e desempenho de cada back-end para melhor atender às necessidades do ambiente front-end, sem se preocupar em afetar outras experiências de front-end.Fine-tune the behavior and performance of each backend to best match the needs of the frontend environment, without worrying about affecting other frontend experiences.

Diagrama do padrão de back-ends para front-ends

Como cada back-end é específico para uma interface, ele pode ser otimizado para essa interface.Because each backend is specific to one interface, it can be optimized for that interface. Como resultado, ele será menor, menos complexo e provavelmente mais rápido do que um back-end genérico que tenta satisfazer os requisitos de todas as interfaces.As a result, it will be smaller, less complex, and likely faster than a generic backend that tries to satisfy the requirements for all interfaces. Cada equipe da interface tem autonomia para controlar seu próprio back-end e não depende de uma equipe centralizada de desenvolvimento de back-end.Each interface team has autonomy to control their own backend and doesn't rely on a centralized backend development team. Isso dá flexibilidade à equipe da interface quanto à seleção da linguagem, cadência da versão, priorização de carga de trabalho e integração de recursos no back-end.This gives the interface team flexibility in language selection, release cadence, prioritization of workload, and feature integration in their backend.

Para obter mais informações, confira Padrão: Back-ends para Front-ends.For more information, see Pattern: Backends For Frontends.

Problemas e consideraçõesIssues and considerations

  • Leve em consideração quantos back-ends serão implantados.Consider how many backends to deploy.
  • Se interfaces diferentes (como clientes móveis) vão fazer as mesmas solicitações, veja se é necessário implementar um back-end para cada interface ou se um back-end único será suficiente.If different interfaces (such as mobile clients) will make the same requests, consider whether it is necessary to implement a backend for each interface, or if a single backend will suffice.
  • A duplicação de códigos entre serviços é altamente provável quando esse padrão é implementado.Code duplication across services is highly likely when implementing this pattern.
  • Serviços de back-end voltados ao front-end devem conter apenas o comportamento e a lógica específicos do cliente.Frontend-focused backend services should only contain client-specific logic and behavior. A lógica de negócios gerais e outros recursos globais devem ser gerenciados em outro local do seu aplicativo.General business logic and other global features should be managed elsewhere in your application.
  • Pense em como esse padrão pode se refletir nas responsabilidades de uma equipe de desenvolvimento.Think about how this pattern might be reflected in the responsibilities of a development team.
  • Leve em consideração o tempo que levará para implementar esse padrão.Consider how long it will take to implement this pattern. O esforço para compilar os novos back-ends implicará em dívida técnica enquanto você continua a oferecer suporte ao back-end genérico existente?Will the effort of building the new backends incur technical debt, while you continue to support the existing generic backend?

Quando usar esse padrãoWhen to use this pattern

Use esse padrão quando:Use this pattern when:

  • Um serviço de back-end compartilhado ou de uso geral deve ser mantido com significativa sobrecarga de desenvolvimento.A shared or general purpose backend service must be maintained with significant development overhead.
  • Você deseja otimizar o back-end para os requisitos de interfaces de cliente específicas.You want to optimize the backend for the requirements of specific client interfaces.
  • As personalizações são feitas para um back-end de fins gerais para acomodar várias interfaces.Customizations are made to a general-purpose backend to accommodate multiple interfaces.
  • Uma linguagem alternativa é mais adequada para o back-end de uma interface do usuário diferente.An alternative language is better suited for the backend of a different user interface.

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

  • Quando interfaces fazem solicitações iguais ou semelhantes para o back-end.When interfaces make the same or similar requests to the backend.
  • Quando apenas uma interface é usada para interagir com o back-end.When only one interface is used to interact with the backend.