Princípios de design – Desenvolvimento de aplicativos modernos

Melhores práticas que regem arquiteturas de aplicações.

 

Abrir tudo Fechar tudo

    • Use plataformas low-code se possível; se não, use linguagens de programação maduras e estruturas leves

      Visão geral
      As linguagens de programação e estruturas que você adota para criar sua aplicação desempenham um papel fundamental em sua entrega e manutenção bem-sucedidas ao longo do tempo. As opções de linguagem e estrutura têm consequências de longo prazo em como você dimensiona seus negócios, opera suas aplicações e oferece recursos de alta qualidade para seus clientes. Geralmente, as alterações de idioma ou estrutura são caras. O suporte a ecossistemas paralelos de várias linguagens e estruturas aumenta a complexidade e reduz a agilidade.

      A escolha da linguagem e da estrutura tem impacto em uma série de factores, incluindo a velocidade de entrega, a estabilidade e a força do ecossistema existente, a prontidão operacional e o desempenho da produção. Sempre que possível, use plataformas low-code para que você possa se concentrar em resolver seus problemas de negócios em vez de enfrentar as complicações do desenvolvimento tradicional. Se os requisitos da aplicação forem mais complexos, escolha linguagens maduras e estruturas leves.

      Detalhes básicos
      As plataformas low-code permitem criar, testar e implementar aplicações corporativas mais rápido do que com a codificação manual tradicional. Essas plataformas são adequadas para criar aplicações oportunistas em colaboração com partes interessadas, bem como aplicações de relatório e análise de dados. As plataformas low-code também permitem estender aplicações SaaS e modernizar as legadas. Essa abordagem ajuda a evitar complicações quando você deseja adicionar novos recursos, como visualização, coleta e análise de dados, segurança, acessibilidade, desempenho e globalização. Uma plataforma low-code reduz significativamente essas complicações e a quantidade de código que você mantém.

      No entanto, se a aplicação tiver requisitos mais sofisticados, escolha uma linguagem de programação madura juntamente com uma estrutura leve. Ao escolher uma linguagem de programação, opte por uma que ofereça benefícios como:

      • Segurança
      • Alto desempenho e eficiência
      • Suporte de ferramentas
      • Documentação extensa e atualizada
      • Um ecossistema de bibliotecas
      • Conformidade com um conjunto de testes ou implementação de referência
      • Uma comunidade forte

      As linguagens mais recentes tendem a ter uma taxa maior de mudança no seu design de linguagem e no ecossistema e nas bibliotecas correspondentes. Uma taxa de mudança mais alta significa que é mais difícil avaliar o risco e mais caro fazer as mudanças subsequentes.

      Ao escolher uma estrutura, selecione uma que seja de código-fonte aberto. Os frameworks de código aberto estão sob constante revisão por pares, o que significa que os recursos estão próximos do que a maioria dos desenvolvedores deseja porque contribuem para a criação e manutenção dos frameworks. Os bugs são encontrados e corrigidos rapidamente. Selecione uma estrutura leve que consuma poucos recursos, como CPU, memória, largura de banda da rede ou identificadores de arquivo.

      Use uma estrutura de aplicação que equilibre a melhoria do foco da tarefa (lógica de negócios sobre texto padronizado e scaffolding) com flexibilidade (permitindo oferecer suporte às necessidades de recursos atuais e futuras). Adote uma estrutura que forneça padrões fáceis de usar, sensíveis e não controversos para recursos comuns, como registro, telemetria, segurança, configuração e padrões comuns, como a construção de APIs REST.

      Recomendações da Oracle
      Oracle APEX é uma plataforma low-code que fornece componentes de alto nível, como formulários, gráficos e widgets de interface do usuário. O APEX também fornece padrões de design comuns por meio de um ambiente de desenvolvimento gráfico intuitivo. As aplicações desenvolvidas usando APEX podem acessar dados locais via SQL e integrar-se a serviços externos usando APIs REST. Além disso, você pode publicar a funcionalidade desenvolvida no APEX como APIs REST para consumo externo.

      Se uma plataforma low-code for inadequada para sua aplicação, adote o Java como sua linguagem de programação. O Java fornece um conjunto estável e amplo de recursos para casos de uso mais comuns de aplicações e tem um ecossistema saudável de bibliotecas e estruturas confiáveis e estáveis para o desenvolvimento de aplicações modernas. O foco do Java na simplicidade e legibilidade, juntamente com seu excelente suporte para ferramentas de desenvolvedor - incluindo ferramentas de análise estática e estruturas de teste - reduzem os custos de manutenção de software e o risco de bugs em aplicações de produção.

      Use GraalVM para desenvolver e executar sua aplicação. O GraalVM é uma distribuição do JDK que combina a estabilidade do Java com o melhor desempenho da categoria por meio de otimização dinâmica de tempo de execução, correção frequente e proativa de vulnerabilidades de segurança e análise de desempenho de baixo custo e ferramentas de diagnóstico, como o Java Flight Recorder.

      Crie seu aplicação com uma abordagem API-first usando o Graal Development Kit for Micronaut ou a estrutura Helidon. Ambas as abordagens fornecem uma base que reduz significativamente o tempo de entrega da sua aplicações e padrões fáceis de usar para casos de uso comuns, como APIs REST, com base em um conjunto de opções de estrutura simples e claras para atividades comuns, como logs, telemetria e armazenamento. Além disso, as duas abordagens dão suporte a serviços de alto desempenho, através de E/S sem bloqueio com APIs reativas idiomáticas, e baixa latência, com bibliotecas de rede de alto desempenho.

      • Escolha o Helidon MicroProfile para aplicações que estejam estreitamente alinhadas com o ecossistema Java corporativo, por exemplo, CDI, JAX-RS ou JPA. O suporte orientado a padrões da Helidon para padrões corporativos Java modernos por meio do MicroProfile simplifica a porta de aplicações Java EE existentes para microsserviços.
      • Escolha Graal Development Kit for Micronaut (GDK) ou Helidon SE para aplicações que não dependem do ecossistema Java existente. A base de aplicação com tempo de compilação do GDK aumenta o desempenho em tempo de execução e permite a verificação em nível de estrutura, o que pode eliminar muitos problemas de segurança e qualidade relacionados à reflexão e à configuração de tempo de execução.

      Tanto o Helidon quanto o GDK têm suporte integrado para imagem nativa do GraalVM, o que permite que você crie aplicações compactas e com uso eficiente de memória.

    • Crie seu aplicativo como um conjunto de serviços que se comunicam por meio de APIs REST

      Visão geral
      Divida os recursos ou tarefas do aplicativo em serviços independentes de combinação flexível que funcionam em conjunto. Crie cada serviço com um escopo funcional limitado, como foco em um recurso ou capacidade. Em comparação com uma arquitetura monolítica tradicional, essa abordagem melhora a manutenção de aplicativos, desenvolvimento de recursos, testes, implementação e escalabilidade.

      Adote uma abordagem de design de API REST que prioriza o contrato para fornecer interfaces claras e compreensíveis para comunicação com e entre serviços. Um contrato de API fornece o mecanismo necessário para que as equipes colaborem e consumam funcionalidades sem depender dos detalhes internos da implementação de um serviço. Por exemplo, um serviço pode ser de propriedade total de uma equipe de desenvolvimento que pode melhorar livremente sua implementação sem ter que coordenar as dependências de código com outras equipes de desenvolvimento.

      Detalhes básicos
      Comece com uma abordagem centrada em contratos especificando a API REST de um serviço. Em seguida, faça um protótipo de implementação da API para que as partes interessadas, como a equipe que usará a API, possam experimentá-la. Quando todos concordam com os detalhes da API, equipes independentes podem trabalhar em paralelo para implementar o serviço, entre outros, que serão utilizados.

      Defina a aplicação de políticas para contratos de nível de serviço e segurança no início do ciclo de vida do produto para garantir que todas as partes interessadas tenham uma compreensão clara de todos os aspectos dos contratos de serviço.

      Trate sua especificação de API como código e gerencie-a em um sistema de controle de versão junto com seu código-fonte e configurações de política.

      Recomendações da Oracle
      Especifique sua API usando o formato independente de implementação OpenAPI e armazene-a em um repositório fornecido pelo Oracle Cloud Infrastructure (OCI) DevOps.

      Implemente seus serviços usando uma abordagem leve de código aberto, como o Graal Development Kit for Micronaut ou Helidon.

      Implemente os serviços em plataformas serverless, como o Oracle Container Engine for Kubernetes ou o Oracle Functions, para facilitar a implementação, escalabilidade e economia.

      Use o Oracle Cloud Infrastructure API Gateway para criar endpoints privados ou públicos protegidos e controlados a partir da especificação da API.

      Use o Oracle Cloud Infrastructure Service Mesh para simplificar e proteger a comunicação entre serviços hospedados em seu cluster do Oracle Container Engine for Kubernetes. O OCI Service Mesh também permite observar todo o tráfego de rede entre os seus serviços através das métricas e registros emitidos pelo componente de proxy executado como sidecar nos pods da aplicação.

    • Empacote e implemente a aplicação na forma de contêineres

      Visão geral
      Um contêiner encapsula o código e suas dependências como uma entidade única, permitindo que uma aplicação seja executada de forma rápida e confiável em vários ambientes de processamento. Uma imagem de contêiner é um arquivo que, quando executado, criará e iniciará um contêiner em um ambiente de processamento.

      Em comparação com as máquinas virtuais tradicionais, os contêineres são menores, requerem menos recursos e têm menores tempos de inicialização. Eles também não dependem de plataforma e podem executar aplicações em qualquer lugar. Para aproveitar esses benefícios, decomponha o seu aplicativo em serviços que executam uma função comercial distinta e empacote cada serviço como um contêiner. Para aplicativos legados, substitua gradualmente cada função existente por um serviço em contêiner até que todo aplicativo seja reconstruído.

      Detalhes básicos
      Empacotar o código da aplicação e as dependências em uma única unidade executável (uma imagem de contêiner) significa que um contêiner é extremamente portátil. Ao combinar essa portabilidade com a abstração de infraestrutura, os contêineres trazem consistência operacional ao aplicativo. Independentemente do aplicativo ser executado on-premises - em um servidor físico - ou na nuvem - em uma máquina virtual - ela sempre produz os mesmos resultados.

      Por meio dessa reprodutibilidade e previsibilidade consistentes, os contêineres simplificam os processos de DevOps e permitem que as equipes de desenvolvimento implementem aplicativos em menos tempo. Ao fornecer isolamento em nível de processo e por serem substituídos com frequência, os contêineres simplificam e agilizam os processos associados à correção de vulnerabilidades de software. Desmembrar aplicativos em serviços com contêineres modulares também os torna mais robustos. Um erro ou falha em um serviço individual não desativa todo aplicativo, e você pode atualizar ou corrigir cada serviço independentemente do restante do aplicativo.

      Ao contrário de uma máquina virtual, um contêiner não vem com um sistema operacional próprio. Em vez disso, ele compartilha o sistema operacional de seu host. Como resultado, os contêineres são menores em tamanho e mais rápidos de serem iniciados do que as máquinas virtuais. A maioria das imagens de contêiner tem dezenas de megabytes de tamanho em comparação com as máquinas virtuais que podem ter vários gigabytes, e são inicializadas em segundos, em vez dos minutos necessários para iniciar as máquinas virtuais.

      A melhor maneira de executar e dimensionar o seu aplicativo com serviços modulares em contêineres é por meio da implementação de um serviço por contêiner. Essa abordagem isola os serviços uns dos outros, o que elimina o tempo de inatividade e permite o dimensionamento independente para cada serviço.

      Embora você possa implementar contêineres manualmente, é preferível usar um software de gerenciamento de contêiner que se integre às suas ferramentas de integração e implementação contínuas.

      Recomendações da Oracle
      Use o Oracle Cloud Infrastructure Registry (Container Registry) para armazenar suas imagens de contêiner e o Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) para executar e gerenciar seus contêineres. Esses serviços totalmente gerenciados estão integrados aos recursos da plataforma OCI, disponíveis em todas as regiões da Oracle Cloud e atendem a padrões regulatórios, como PCI, ISO, SOC, HIPAA e FedRAMP.

      Além de armazenar imagens de contêiner no Container Registry, você pode armazenar listas de manifestos (às vezes chamadas de imagens de várias arquiteturas) para oferecer suporte a várias arquiteturas, como ARM e AMD64. Para identificar e mitigar possíveis vulnerabilidades de segurança, ative a verificação de imagens em todas as imagens carregadas no Container Registry. Você também deve assinar suas imagens de contêiner para garantir que somente imagens autorizadas e confiáveis sejam implementadas no OKE.

    • Automatize a criação, o teste e a implementação

      Visão geral
      A integração contínua (CI) e a implementação contínua (CD) são um conjunto de ferramentas e procedimentos que as equipes de desenvolvimento usam para gerar alterações de código com frequência e confiabilidade. As práticas recomendadas de CI/CD incluem revisões de código, orientação para testes de unidade, testes de integração, check-ins de código, arquivamento de tíquetes e implementação de aplicações em ambientes de desenvolvimento e teste.

      A integração contínua é uma prática frequente em que os desenvolvedores incorporam as mudanças do código na versão principal de um repositório compartilhado. As alterações dos desenvolvedores são validadas criando uma compilação e, em seguida, executando testes automatizados na compilação. Isso garante que o aplicativo não seja interrompido quando novas alterações forem integradas à ramificação principal.

      As vantagens da integração contínua incluem:

      • Menos bugs são enviados para produção porque testes automatizados detectam falhas de regressão antecipadamente
      • Os problemas de integração são resolvidos antecipadamente, facilitando o processo de criação
      • Os erros são detectados e localizados com mais rapidez e facilidade (já que cada alteração costuma ser pequena)

      A entrega contínua é um passo além da integração contínua; depois de passar nos testes apropriados, uma compilação é entregue automaticamente a um ambiente de teste e/ou produção. O objetivo da entrega contínua é sempre ter uma base de código pronta para implementação em um ambiente de produção do cliente.

      As vantagens adicionais da entrega contínua incluem:

      • A automação de implementações complexas significa que a equipe reduzirá o tempo de preparação da versão
      • Lançamentos mais frequentes ajudam a acelerar os ciclos de feedback do cliente
      • Iteração mais rápida porque há menos pressão nas decisões para pequenas mudanças

      A implementação contínua vai um passo além da entrega contínua; cada mudança que passa em todos os testes é implementada automaticamente no ambiente de produção do cliente. Não há intervenção humana - apenas um teste com falha pode impedir que uma nova alteração seja implementada na produção. Sem intervenção humana, a implementação contínua é altamente dependente de uma automação de teste bem projetada.

      As vantagens adicionais da implementação contínua incluem:

      • Maior velocidade de desenvolvimento porque os lançamentos não exigem interrupção
      • Maior satisfação do cliente graças à qualidade aprimorada e um fluxo contínuo de melhorias

      A CI/CD fornece as melhores práticas para armazenar, integrar, implementar e manter código para automatizar a forma como você cria os aplicativos. Essas práticas recomendadas incluem:

      • Aplique o paradigma "shift-left" e foque na detecção e prevenção de problemas o mais cedo possível durante o ciclo de vida de desenvolvimento do software (SDLC). Por exemplo, você pode monitorar as dependências de terceiros do seu aplicativo acerca de vulnerabilidades durante a integração contínua.
      • Use um repositório de código baseados em Git para armazenar todos os seus ativos relacionados a códigos. Você também pode aproveitar um serviço de artefatos imutáveis para armazenar os ativos derivados.
      • Para implementar a integração contínua, mescle todo o código em uma versão "release candidate" pelo menos uma vez por dia. Ao mesclar o código nessa versão, verifique se as compilações são acionadas automaticamente. Como parte do pipeline de compilação, execute todos os testes de unidade e corrija imediatamente quaisquer falhas de pipeline antes do desenvolvimento adicional na versão do release candidate. Use verificações de segurança no código para detectar vulnerabilidades. Não armazene artefatos que tenham algum problema de vulnerabilidade. Corrija todas as vulnerabilidades na versão aplicável do release candidate antes de continuar o desenvolvimento.
      • Para implementação contínua, entregue automaticamente as release candidates para o ambiente de teste ou use implementações canário. Quando as implementações de teste forem aprovadas, promova-as automaticamente para produção total. Se as implementações de teste falharem, resolva imediatamente os problemas antes de continuar o desenvolvimento na versão release candidate. Use recursos de segurança como parte das implementações para evitar que artefatos não autorizados e vulneráveis sejam implementados na infraestrutura.
      • No ambiente de produção, use ferramentas de monitoramento para avaliar a integridade dos aplicativos implementados e detectar quaisquer vulnerabilidades após a implementação. Se algum problema for detectado, implemente o rollback automático para a versão anterior. Execute verificações de segurança no ambiente após a implementação e resolva imediatamente quaisquer problemas detectados.

      Recomendações da Oracle
      Use o serviço DevOps para automatizar a implementação dos aplicativos nativos da nuvem. Primeiro, armazene o código em um repositório de código DevOps e crie uma versão de release. Faça acréscimos pequenos para alterar a versão do release e reconciliar diariamente os problemas da versão, garantindo a estabilidade Depois use a funcionalidade de acionadores no repositório de código para iniciar automaticamente um pipeline de criação DevOps.

      Use um único pipeline de criação DevOps para criar todos os artefatos associados ao repositório de códigos. Se a criação falhar, configure o pipeline de criação para aguardar a aprovação antes de concluir. A solicitação de aprovação deve ir para o comitê que acionou a criação e resolver o problema com uma nova aprovação de código e, em seguida, aprovar a conclusão da build. Para compilações bem-sucedidas, configure o pipeline de compilação para entregar automaticamente os artefatos ao serviço Oracle Cloud Infrastructure Artifacts Registry e para acionar automaticamente um pipeline de implementação DevOps.

      Inclua o Application Dependency Management para detectar vulnerabilidades de segurança (CVEs) nas dependências da aplicação durante o estágio de desenvolvimento dentro do pipeline de desenvolvimento da OCI DevOps. Dessa forma, você conseguirá detectar e remediar CVEs em potencial assim que elas forem descobertas.

      Use o Resource Manager para criar todos os ambientes de infraestrutura em uma zona de segurança máxima para obter segurança automática sobre a implementação. Com o Resource Manager, você pode usar a infraestrutura como código para automatizar a criação da infraestrutura em todas as suas regiões de maneira consistente. Em seguida, você pode configurar o pipeline de implementação do DevOps para sempre implementar nos recursos que você criou dentro da zona de segurança.

      Crie um único pipeline de implementação DevOps que implementa todos os artefatos criados a partir de um único pipeline da compilação. Organize os ambientes de implementação: região da OCI, domínio de disponibilidade e domínio de falha. Configure o pipeline com uma estratégia de implementação canário, contínua ou azul-verde. Configure-o também para acionar testes automaticamente. Ative o OCI Monitoring e o Application Performance Monitoring em sua aplicação e infraestrutura para detectar problemas.

      Se nenhum problema for detectado e os testes forem concluídos com sucesso, configure o pipeline de implementação para implementar automaticamente os artefatos no próximo ambiente na estratégia de implementação até que os artefatos sejam totalmente implementados em todos os ambientes de produção. Ao implementar no ambiente de produção, configure o pipeline para ser implementado em todos os domínios de falha em um domínio de disponibilidade de cada vez. Implemente em cada domínio de uma região e depois em cada região. Continue a usar o OCI Monitoring e o Application Performance Monitoring na aplicação e na infraestrutura para detectar problemas rapidamente. Configure alertas e, se alguma métrica principal cair repentinamente durante a implantação, falhe automaticamente a implantação e acione uma reversão para a versão anterior.

    • Use serviços gerenciados para eliminar a complexidade no desenvolvimento e nas operações de aplicativos

      Visão geral
      Um serviço gerenciado fornece funcionalidade específica sem exigir que você execute tarefas de manutenção relacionadas à otimização do desempenho, disponibilidade, dimensionamento, segurança ou atualização. Com um serviço gerenciado, você pode se concentrar em fornecer recursos para seus clientes em vez de se preocupar com a complexidade das operações.

      Um serviço gerenciado da OCI fornece um componente escalonável e seguro para o desenvolvimento nativo da nuvem. Use serviços gerenciados para desenvolver e executar a aplicação e armazenar os dados. Você pode obter as melhores soluções da categoria sem precisar de experiência em cada domínio para criar e operar o aplicativo.

      Detalhes básicos
      Os serviços gerenciados permitem criar aplicações altamente disponíveis, escaláveis, ágeis e de alto desempenho com segurança, conformidade e resiliência.

      Os serviços gerenciados abstraem a complexidade dos componentes subjacentes do aplicativo, facilitando o armazenamento e a recuperação de dados ou a criação e execução do aplicativo. Os serviços se integram a conjuntos de ferramentas que fornecem criação, teste e implementação automatizados do aplicativo. Os serviços gerenciados melhoram a produtividade e reduzem o tempo de lançamento no mercado.

      Os serviços gerenciados centralizam e automatizam várias tarefas de gerenciamento de infraestrutura, removendo erros humanos e a necessidade de habilidades especializadas. A infraestrutura subjacente é mantida atualizada e segura, e os serviços permitem monitorar e rastrear modificações ou acessos, o que garante a confidencialidade e integridade do aplicativo e dos dados.

      Os serviços gerenciados são altamente disponíveis e escaláveis, atendendo às necessidades do aplicativo, e você paga apenas pelo que usa. É possível começar com pouco e escalar sem experimentar qualquer degradação no desempenho ou na confiabilidade.

      Recomendações da Oracle
      Recomendamos os seguintes serviços na nuvem:

      • Oracle Autonomous Database para gerenciar dados para armazenamento de dados ou processamento de transações. O Autonomous Database oferece bancos de dados na memória, NoSQL e SQL com uma vantagem autônoma para reduzir a sobrecarga de gerenciamento.
      • Use o Oracle Cloud Infrastructure Container Engine for Kubernetes para criar, executar e gerenciar os seus contêineres.
      • Oracle Functions para criar, executar e escalar os aplicativos que são executadas de forma segura e isolada por curtos períodos, sem gerenciar qualquer infraestrutura.
      • Oracle API Gateway para criar endpoints privados ou públicos protegidos e governados a partir das especificações da API.
      • Oracle Cloud Infrastructure Object Storage para armazenar ou recuperar com segurança um volume ilimitado de dados não estruturados de qualquer tipo de conteúdo. Ele é dimensionado sem problemas, sem experimentar qualquer degradação no desempenho ou na confiabilidade do serviço.
      • Os serviços da Oracle Cloud Observability and Management Platform se integram a todos os serviços anteriores para permitir a visibilidade de logs, métricas e eventos.
      • Oracle Application Express (APEX) para criar rapidamente aplicações low-code, modernas e orientadas por dados. O APEX pode maximizar a disponibilidade e a escalabilidade para lidar com as demandas em constante mudança de sua aplicação low-code. Ele fornece gerenciamento automatizado, alto desempenho consistente, dimensionamento automático e fácil administração.

      Esses serviços possuem alta disponibilidade, desempenho e elasticidade. A infraestrutura subjacente é gerenciada e corrigida para garantir que o seu aplicativo permaneça protegido.

    • Mantenha a camada do aplicativo sem monitoramento de estado

      Visão geral
      O estado de um aplicativo pode consistir em muitos elementos, incluindo caches de dados, preferências de um usuário, personalização, mensagens trocadas entre serviços, localização em um fluxo de trabalho de várias etapas, implementação do aplicativo, configuração do tempo de execução , e uma sessão de usuário (por exemplo, a página que um usuário visitou pela última vez ou o tamanho e os itens no carrinho de compras de um usuário). Se o estado do aplicativo for perdido, isso pode resultar em perda de dados, mau funcionamento, uma experiência de usuário abaixo do ideal e, às vezes, uma falha completa no aplicativo.

      Se você armazenar o estado do aplicativo em sistemas de arquivos locais ou na memória de um único host, ele poderá ser perdido se o aplicativo sofrer interrupções, como reinicializações ou falhas de disco localizadas. Em vez disso, armazene o estado em armazenamentos de persistência externos. Use o mínimo possível de armazenamentos de persistência. O ideal é usar apenas um para fornecer consistência aos dados.

      Detalhes básicos
      Os elementos do estado do aplicativo são tradicionalmente armazenados como vários artefatos em vários formatos, como objetos serializados, documentos JSON ou XML ou arquivos de texto. Se esses elementos forem armazenados em vários armazenamentos de persistência, como sistemas de arquivos externos, armazenamentos de mensagens, armazenamentos de objetos, vários bancos de dados ou armazenamento em bloco elástico, é possível que os diferentes armazenamentos de dados fiquem fora de sincronia e resultem em estados inconsistentes. Um aplicativo também deve implementar transações, junções e idempotência para garantir a consistência dos dados quando o estado precisar ser atualizado como uma unidade.

      Ao espalhar elementos do estado de um aplicativo em várias lojas, as oportunidades aumentam para vulnerabilidades de segurança. As operações de ciclo de vida - como adicionar e remover nós, correção, backup, recuperação e replicação para desastres e recuperação - tornam-se extremamente complexas e requerem consideração especial para manter a consistência do estado em diferentes armazenamentos.

      Como resultado, uma melhor abordagem é armazenar todo o estado da aplicação e seus dados em um único banco de dados, se possível. Os dados permanecem consistentes em uma única loja e são mais fáceis de gerenciar. Com essa abordagem, as instâncias do aplicativo podem ser substituídas. Isso é especialmente útil em arquiteturas de aplicativos modernos, como microsserviços elásticos ou instâncias efêmeras em que uma instância existe apenas para atender a uma ou algumas solicitações. A adição de um nó é simplificada porque um novo nó pode obter a cópia mais recente do estado e remover um nó não resulta na perda total do estado. As correções podem ser aplicadas de forma contínua ao substituir os executáveis. Um nó pode ser restaurado de backups e adquirir o estado do banco de dados. O estado pode ser replicado consistentemente como uma unidade para diferentes regiões para recuperação de desastres. Ter um estado consistente em diferentes regiões pode garantir que não haverá problemas funcionais do aplicativo após um failover ou alternância.

      Recomendações da Oracle
      Se o seu aplicativo usa um banco de dados, use o mesmo banco de dados para armazenar seu estado. Um banco de dados oferece melhor disponibilidade, integridade e segurança do que alternativas como arquivos ou representações residentes na memória. O ideal é usar um banco de dados multimodelo (que pode armazenar diferentes formatos) para armazenar todos os elementos do estado do aplicativo. O uso de um banco de dados multimodelo, em vez de vários armazenamentos de dados de finalidade única, também permite obter e manter facilmente a consistência entre todos os elementos do estado do aplicativo. (Observação: Embora seja permitido armazenar o estado em cache na aplicação, esta deve ser projetada para usar o banco de dados como a fonte de verdade e ser capaz de recriar seu estado no banco de dados.) O Oracle Database é ideal para esta finalidade. Ele armazena diferentes formatos e fornece desempenho previsível, portanto, armazenar o estado do aplicativo nele não degrada seu desempenho.

      Se o seu aplicativo não usa um banco de dados, use outros armazenamentos de persistência duráveis, como o Oracle Cloud Infrastructure Object Storage, para armazenar o estado. Se o estado do aplicativo não puder ser mantido em um único armazenamento de dados, projete-o para armazenar o estado em vários armazenamentos de dados que podem ser mantidos em sincronia e recuperados como uma unidade consistente após a falha.

      Veja algumas recomendações para armazenar o estado em um Oracle Database.

      • Estado do objeto da sessão do usuário: use o mapeamento de objeto/relação JSON, como JPA ou tabelas relacionais.
      • Caches de dados locais: para dados armazenados em cache na camada do aplicativo, a fonte confiável deve ser o banco de dados. Os caches devem ser recriados no momento da inicialização do aplicativo ou conforme necessário. As atualizações nos caches devem usar o método write-behind, que atualiza o banco de dados de back-end. Outras instâncias de cache em instâncias de aplicativo devem ser notificadas sobre as alterações para que os caches possam ser atualizados.
      • Dados de configuração do aplicativo: são artefatos, como terminais de conexão, limites, níveis de registro em log, destinos de log e números de porta que normalmente são armazenados como documentos JSON, arquivos XML ou arquivos de propriedades. Use o tipo de dados apropriado para armazenar esses dados em um banco de dados.
      • Chamadas de processos remotos ou de comunicação entre processos: normalmente, os microsserviços e componentes da aplicação se comunicam por meio de mensagens. Use as filas de transações do Oracle Database para tornar essas mensagens duráveis, a fim de garantir que elas sobrevivam e sejam processadas durante uma interrupção.
      • Texto (como registros de log de auditoria): os aplicativo geram arquivos de log, como logs de auditoria e logs de diagnóstico. Use o recurso Oracle Text para armazenar esses logs de forma centralizada.
      • Monitoramento de desempenho: as aplicações geram métricas ou dados de séries temporais para fins de monitoramento de desempenho. Use os dados de série temporal do Oracle Database ou a funcionalidade de dados JSON para armazenar esses dados.
      • Estado do fluxo de trabalho: alguns mecanismos de fluxo de trabalho armazenam o estado de um aplicativo localmente, e o failover desses fluxos de trabalho pode resultar em um estado perdido. Use o mecanismo de fluxo de trabalho no banco de dados para evitar esses problemas. No mínimo, configure os mecanismos de fluxo de trabalho para usar o banco de dados como um armazenamento de persistência para seu estado.
    • Use um banco de dados convergente com suporte completo em todos os dados

      Visão geral
      Seu aplicativo pode usar dados em vários formatos, como tabular (relacional), não estruturado, XML, JSON, espacial ou gráfico. Tradicionalmente, essa variedade exigia um tipo diferente de banco de dados para cada formato de dados. Por exemplo: um banco de dados relacional para dados relacionais, um repositório de documentos para dados não estruturados ou um banco de dados gráfico para dados vinculados hierarquicamente. No entanto, o uso de vários bancos de dados geralmente resulta na complexidade operacional adicional e inconsistência de dados. Em vez disso, use um único banco de dados multimodelo para armazenar, indexar e pesquisar vários tipos e formatos de dados.

      Aproveite o recuso de banco de dados para simplificar a lógica do seu aplicativo. Por exemplo, use SQL para consultas, junções e análises; use transações para garantir consistência e isolamento; e use algoritmos de machine learning e recursos analíticos incorporados para evitar transferências desnecessárias de dados. Para proteger dados confidenciais, use os recursos de segurança e o controle de acesso do banco de dados e use a replicação para melhorar a disponibilidade, a escalabilidade e a resiliência dos seus aplicativos.

      Detalhes básicos
      Use um banco de dados multimodelo para armazenar diferentes tipos de dados, como documentos JSON, gráficos de propriedades e dados relacionais. Os bancos de dados multimodelo avançados oferecem suporte completo para qualquer tipo de dados armazenados no banco de dados. Você pode armazenar um novo documento JSON, inserir linhas relacionais e atualizar um gráfico de propriedades na mesma transação ACID. É possível usar instruções SQL para unir, filtrar e agregar esses diferentes tipos de dados, o que fornece consistência e garantias de simultaneidade com as quais você está acostumado em bancos de dados relacionais. Além de oferecer esse rico conjunto de recursos, um banco de dados multimodelo também pode ser usado como um armazenamento de dados de finalidade única, acessado usando APIs diferentes de SQL, como APIs REST, APIs de armazenamento de documentos e APIs de gráficos.

      Uma vantagem principal do uso de um banco de dados multimodelo é a reutilização. Embora os dados possam ser de tipos e formas diferentes, a tecnologia subjacente para gerenciar esses dados não muda. Isso significa que você não precisa aprender várias tecnologias de banco de dados e entender como usá-las e seus respectivos ajustes para cada tipo de dados. E como a tecnologia permanece constante, você não precisa reescrever o código do aplicativo. Além disso, um banco de dados multimodelo melhora a resiliência do aplicativo, reduzindo a fragmentação de dados, facilitando o backup e a recuperação.

      Recomendações da Oracle
      Use o Oracle Autonomous Database, um banco de dados convergente multimodelo, para armazenar, gerenciar e analisar todos os seus dados. Facilite a manutenção do aplicativo usando visualizações para expor os dados em tabelas de modo que o esquema subjacente possa ser alterado sem afetar os aplicativos existentes. Use a redefinição baseada em edição para que você possa atualizar seu aplicativo sem tempo de inatividade. Use o Oracle Data Safe para implementar e avaliar controles de segurança, mascarar dados confidenciais e auditar acessos a dados. Use o Oracle Data Guard como um cache de leitura altamente escalável para seus dados e para manter um backup consistente para recuperação de desastres.

      O Oracle Autonomous Database executa tarefas operacionais sem impacto ou interrupção na carga de trabalho. Isso significa que você não precisa adicionar lógica de compensação complexa à aplicação para lidar com cenários de dimensionamento ou failover. O banco de dados gerencia recursos, como CPU e armazenamento, de forma independente e oferece escalabilidade bidirecional elástica.

    • Monitoramento e rastreamento completos do instrumento

      Visão geral
      Uma única solicitação de usuário pode seguir um caminho complexo em vários serviços ou microsserviços que compõem um aplicativo moderno. O rastreamento de ponta a ponta segue o processo de origem da solicitação para obter informações sobre sua infraestrutura e ajudar a depurar a causa raiz dos problemas. O monitoramento geralmente é usado como uma ferramenta de diagnóstico, alertando seus desenvolvedores quando o aplicativo não está funcionando conforme o esperado.

      Desenvolvedores, administradores e responsáveis pela segurança devem manter um entendimento autorizado e oportuno da integridade, do desempenho, do estado operacional e dos possíveis incidentes de segurança do seu aplicativo. Esse entendimento garante que a função e o desempenho da aplicação atendam às expectativas durante seu ciclo de vida, além de agilizar o diagnóstico de incidentes e a recuperação de aplicações. O monitoramento e o rastreamento completos e abrangentes devem ser fáceis de implementar e gerenciar sem deixar o aplicativo complexo.

      Detalhes do princípio
      O seu aplicativo pode não se comportar como esperado de diversas formas. Por exemplo, pode ter um desempenho ruim ou simplesmente falhar. Ao contrário de um aplicativo monolítico tradicional, um aplicativo criado a partir de microsserviços apresenta desafios de diagnóstico adicionais devido às múltiplas interações entre seus componentes.

      O rastreamento é a melhor maneira de entender rapidamente o que acontece com uma solicitação de usuário conforme ela percorre os microsserviços e outros componentes ,como infraestrutura, que compõem o aplicativo. Use o rastreamento completo para coletar dados sobre cada solicitação do usuário. Em seguida, examine os dados para ver onde o seu aplicativo pode estar enfrentando gargalos e latência. Por exemplo, uma solicitação pode passar por vários microsserviços antes de ser atendida. Sem uma forma de rastrear toda a jornada de um pedido, não há como determinar a causa raiz da falha.

      O monitoramento geralmente é muito mais direcionado, melhorando sua compreensão de como o seu aplicativo se comporta ao instrumentá-la e depois coletar, agregar e analisar métricas. O monitoramento completo também permite integração inteligente e automatizada com ferramentas para ajustar dinamicamente a capacidade de recursos e coordenar respostas a eventos inesperados.

      Ter uma compreensão clara, precisa e oportuna do estado operacional e do histórico de um aplicativo não é apenas medir a experiência de um usuário final. Você também pode precisar manter a conformidade com as jurisdições regionais ou nacionais que podem exigir a capacidade de gerar, sob demanda, relatórios de atividades detalhados ou atestados sobre o manuseio de elementos de dados confidenciais específicos.

      Em geral, as soluções de monitoramento devem ser compatíveis com ferramentas de terceiros e se alinhar com as ferramentas administrativas do seu ambiente. É importante manter a flexibilidade do design e evitar a depender do fornecedor.

      Recomendações da Oracle
      Crie recursos abrangentes de monitoramento e rastreamento em seu aplicativo desde o início e mantenha-os consistentes durante todo o ciclo de vida. Os recursos não devem aumentar a complexidade de desenvolvimento, teste e implementação, além de serem fáceis de implementar e gerenciar. Quando possível, adote soluções que se estendam para acomodar a diversidade de plataformas que você usa atualmente e pode implementar no futuro.

      Os serviços da OCI, como o Monitoring, são projetados para fornecer suporte pronto para uso para fins de monitoramento. Além disso, você pode estender muitos serviços da OCI aos componentes da aplicação usando uma experiência consistente de implementação e gerenciamento por meio de APIs e SDKs compatíveis. Por exemplo, você pode adicionar coleta de métricas de monitoramento automatizado ou captura de log com armazenamento centralizado para todas as suas máquinas virtuais e aplicativos.

      Durante o desenvolvimento e o teste, você pode configurar os serviços para coletar apenas informações básicas de depuração ou teste de desempenho. À medida que o aplicativo se aproxima da implementação da produção, aumente o escopo, a frequência e a rastreabilidade das informações coletadas fazendo atualizações simples nos parâmetros de configuração existentes.

      O Oracle Cloud Infrastructure Service Mesh captura automaticamente uma variedade de métricas e registros dos serviços executados no Oracle Container Engine for Kubernetes. Você pode usar esses dados para acompanhar a saúde dos seus serviços dentro da malha e melhorar o desempenho da aplicação.

      Use uma coleta de dados robusta e centralizada para todo o ambiente de tenancy de nuvem, fornecendo um único local para análise, investigação coordenada e geração de alertas. O Service Connector Hub permite respostas flexíveis, consistentes e personalizáveis para eventos. O OCI Logging Analytics permite análise e investigação eficientes de todos os seus sistemas de log de eventos na nuvem (e externos). Você também pode usar OCI Service Connector Hub, Functions e Notifications para transformar métricas e logs ingeridos em alertas acionáveis. E você pode aproveitar nossas integrações com produtos e serviços de terceiros, como Splunk e Grafana.

      Os seguintes serviços da OCI ajudam a consolidar seu registro, monitoramento e rastreamento nos ambientes que hospedam sua aplicação: Logging, Monitoring, Logging Analytics, Application Performance Monitoring, OS Management, Database Management e Java Management Service. Esses serviços totalmente gerenciados são integrados aos recursos comuns da infraestrutura da OCI e fornecem mecanismos suportados para integrar seus recursos de aplicativos personalizados.

    • Elimine o ponto único de falha por meio da replicação automatizada de dados e da recuperação de falhas

      Visão geral
      Um único ponto de falha é um componente de um aplicativo que, em caso de falha, torna o aplicativo inteiramente indisponível ou não confiável. Ao desenvolver um aplicativo para ser altamente disponível e confiável, use a replicação de dados automatizada para garantir que a falha de um único componente não leve à perda de dados.

      A replicação de dados entre máquinas e o uso de rede redundante protegem você contra falhas rotineiras da máquina e da rede. A replicação dos dados em data centers (ou “domínios de disponibilidade”) em várias regiões geográficas protege contra desastres localizados, como incêndios, terremotos, inundações ou furacões.

      Detalhes básicos
      Para que a seu aplicativo obtenha alta disponibilidade, é necessário garantir que os dados dos quais o seu aplicativo depende permaneçam disponíveis quando ocorrerem falhas. A chave para alta disponibilidade de dados é redundância por meio de replicação automatizada de dados.

      A replicação é o processo de copiar e manter objetos de banco de dados, como tabelas, em vários bancos de dados que compõem um sistema de banco de dados distribuído. As alterações aplicadas em um site são capturadas e armazenadas localmente antes de serem encaminhadas e aplicadas em cada uma das réplicas localizadas em locais remotos.

      Bancos de dados replicados podem funcionar em dois modos diferentes: ativo-passivo e ativo-ativo. No modo ativo-passivo, há uma única réplica primária e uma ou mais réplicas secundárias; somente a réplica primária participa do processamento de dados do aplicativo. No modo ativo-ativo, todas as réplicas participam do processamento de dados. O modo ativo-ativo fornece melhor uso de recursos e maior disponibilidade porque não um failover primário-secundário não é necessário.

      A redundância garante que as réplicas de dados falhem de forma independente. As falhas na máquina ou disco geralmente são independentes, mas uma falha de rede ou de energia pode fazer com que um grupo de máquinas falhe simultaneamente. Para proteger contra esses incidentes, a infraestrutura de rede e energia também deve ser redundante, e as réplicas de dados devem ser cuidadosamente colocadas em diferentes máquinas e locais que não podem falhar juntos.

      Recomendações da Oracle
      Os data centers da OCI são cuidadosamente projetados para eliminar pontos únicos de falha catastrófica. Um data center típico ou domínio de disponibilidade contém várias unidades de falha independentes conhecidas como domínios de falha. Dois domínios de falha independentes não podem falhar juntos. Da mesma forma, uma única região pode ter vários domínios de disponibilidade, que são separados geograficamente para garantir que dois deles não possam falhar ao mesmo tempo.

      Use serviços de armazenamento da OCI, como Block Volumes, Object Storage e File Storage, para replicar dados em domínios de falha e disponibilidade para que nenhum ponto único de falha possa afetar a disponibilidade dos dados da aplicação. Aproveite o isolamento resiliente de falhas integrado à OCI usando o Container Engine for Kubernetes para implementar sua aplicação em vários domínios de falha e disponibilidade. O Oracle Autonomous Database, Data Guard e GoldenGate fornecem replicação de hardware e software ativo-ativo para alta disponibilidade, bem como correções e atualizações sem tempo de inatividade. Use esses serviços gerenciados para obter dados altamente disponíveis sem a necessidade de criar e manter sua própria infraestrutura de armazenamento.

    • Implemente a defesa automatizada em profundidade para proteger sua aplicação e seus dados

      Visão geral
      A defesa em profundidade é uma abordagem em que vários controles de segurança independentes e redundantes atuam como camadas de defesa de um aplicativo. As camadas são projetadas para fornecer segurança mesmo que uma delas falhe, por exemplo, um firewall combinado com detecção de invasão.

      No entanto, o gerenciamento manual e a configuração dos controles de segurança podem ser complexos, opacos e propensos a erros — individual e coletivamente. Em vez disso, proteja o seu aplicativo e dados usando controles de segurança automatizados.

      Detalhes básicos
      A defesa em profundidade gerencia o risco usando diversos controles que abrangem os elementos físicos, técnicos, administrativos, operacionais, de pessoal e de procedimentos de segurança. Sua independência significa que eles fornecem uma defesa profunda que lida com falhas, explorações ou outras vulnerabilidades de segurança. Os controles são projetados para abordar os riscos de diferentes maneiras e fornecer registros em log, auditoria e outros recursos para garantir que as tentativas de violação de segurança sejam detectadas e relatadas às partes interessadas apropriadas.

      Em vez de configurar manualmente um conjunto complexo de controles de segurança, use controles automatizados simples e prescritivos para proteger o seu aplicativo. Os controles de segurança automatizados eliminam o erro humano (uma causa raiz de muitos incidentes de segurança) e ajudam a proteger seu aplicativo e seus dados sem exigir que você se torne um especialista em segurança.

      Recomendações da Oracle
      Implemente controles de segurança automatizados fáceis de usar em todos os estágios do ciclo de vida do seu aplicativo, incluindo desenvolvimento, compilação, teste, implementação e tempo de execução. Verifique usuários, permissões e políticas de acesso em cada etapa do ciclo de vida e garanta que o acesso seja concedido somente quando apropriado. Detecte problemas de segurança que são introduzidos no início do ciclo de vida de desenvolvimento de software. A detecção antecipada garante que seu aplicativo seja implementado em produção com as práticas recomendadas de arquitetura de segurança e que os problemas de segurança operacional causados por configurações incorretas ou vulnerabilidades divulgadas sejam detectados e mitigados.

      A OCI oferece vários serviços de segurança automatizados para proteger suas aplicações e seus dados. Veja algumas recomendações para usar os serviços da OCI:

      • Use o Web Application Firewall (WAF) para limitar o tráfego de locais desconhecidos. Para a TLS (Transport Layer Security), use certificados para balanceadores de carga e rotação automática. Ative o WAF em cada balanceador de carga que atende conteúdo HTTPS. Ative regras gerenciadas pela Oracle e ajuste para falsos positivos. Limite o tráfego de países com os quais você não faz negócios por meio de regras de acesso geo-IP. Use inteligência de ameaças no WAF para bloquear nós Tor.
      • Use o Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) para uma abordagem de segurança que prioriza a identidade e permite a fácil integração e gerenciamento de usuários. Use o IAM no front-end do seu aplicativo para autenticar usuários com métodos de autenticação fortes, enquanto mantém uma experiência de usuário ideal por meio de segurança adaptável com reconhecimento de contexto, logon social ou federado opcional ou autenticação sem senha (dependendo dos requisitos). Atenda aos requisitos regulamentares, permitindo que os usuários gerenciem seu consentimento para termos de uso e suporte aos requisitos de residência de dados. Use o OCI IAM no back-end para restringir o acesso aos componentes do aplicativo conforme necessário. Imponha a autenticação para administradores por meio de opções de autenticação multifator (MFA) fortes. Imponha políticas de segurança fortes que permitem acesso somente por meio de permissões concedidas explicitamente. Delimite responsabilidades para que o acesso seja limitado a quem precisa.
      • Criptografe dados em repouso com chaves armazenadas no OCI Vault, apoiadas por módulos de segurança de hardware. Prefira o uso de chaves de criptografia separadas para cada serviço, mas alinhe as entidades do OCI Vault com os compartimentos. Alterne as chaves mestras de criptografia pelo menos uma vez por ano e as chaves de dados a cada três meses. Use um cofre privado na produção e replique as chaves em regiões secundárias. Crie backups e armazene-os no Oracle Cloud Infrastructure Object Storage em uma região separada. Proteja as chaves de criptografia e restrinja o acesso somente às chaves autorizadas pelo proprietário do aplicativo.
      • Use princípios de segurança internos para autorizar instâncias de processamento a executarem ações em outros serviços da OCI.
      • Reforce o princípio de capacidade de alcance mínimo para o isolamento de pontos finais usando o recurso de grupos de segurança de rede nas redes virtuais na nuvem (VCNs) da OCI. Ative o log de NetFlow em cada VCN. Monitore o registro de DNS para atividade de criptomineração ou atividade de servidor de comando e controle.
      • Inicie o seu aplicativo em uma configuração segura por padrão usando as Oracle Security Zones. Use as zonas de segurança máxima para compartimentos com sub-redes privadas. Certifique-se de que o acesso do operador a qualquer instância de processamento em sub-redes privadas passe pelo Oracle Cloud Infrastructure Bastion.
      • Ative o Oracle Cloud Guard e resolva ou aceite e desative todos os problemas. Ative a notificação sobre tendências e trate novos problemas com urgência.
      • Ative o Oracle Data Safe para proteger bancos de dados Oracle monitorando usuários e acesso. O Data Safe também verifica os bancos de dados para obter as melhores práticas de segurança e alertas sobre divergências.
      • Analise periodicamente instâncias e contêineres para problemas de segurança conhecidos usando o Oracle Cloud Infrastructure Vulnerability Scanning Service.
      • Use o OCI Service Mesh para autenticar e criptografar a comunicação entre serviços em seu cluster do Oracle Container Engine for Kubernetes (OKE). O OCI Service Mesh também permite configurar as políticas de acesso para controlar a comunicação entre serviços e validar as solicitações externas.