O que é escalabilidade de software e por que sua empresa deve levar isso a sério?

Publicados: 2023-08-01

Mesmo empresas experientes e bem-sucedidas podem ter problemas com a escalabilidade. Você se lembra do app Aplausos da Disney? Ele permitia que os usuários interagissem com diferentes programas da Disney. Quando o aplicativo apareceu no Google Play, era extremamente popular. Não tão escalável, no entanto. Ele não conseguia lidar com um grande número de fãs, resultando em uma experiência ruim para o usuário. As pessoas ficaram furiosas, deixando comentários negativos e uma classificação de uma estrela no Google Play. O aplicativo nunca se recuperou dessa publicidade negativa.

Você pode evitar problemas como esse se prestar atenção à escalabilidade do software durante os estágios iniciais de desenvolvimento, quer você mesmo o implemente ou use serviços de engenharia de software.

Então, o que é escalabilidade em software? Como garantir que sua solução seja escalável? E quando você precisa começar a escalar?

O que é escalabilidade de software?

O Gartner define escalabilidade como a medida da capacidade de um sistema de diminuir ou aumentar em desempenho e custo em resposta a mudanças nas demandas de processamento.

No contexto do desenvolvimento de software, a escalabilidade é a capacidade de um aplicativo de lidar com a variação da carga de trabalho enquanto adiciona ou remove usuários com custos mínimos. Portanto, espera-se que uma solução escalável permaneça estável e mantenha seu desempenho após um aumento acentuado da carga de trabalho, seja esperado ou espontâneo. Exemplos de aumento da carga de trabalho são:

  • Muitos usuários acessando o sistema simultaneamente
  • Expansão nos requisitos de capacidade de armazenamento
  • Aumento do número de transações sendo processadas

Tipos de escalabilidade de software

Você pode dimensionar um aplicativo horizontalmente ou verticalmente. Vamos ver quais são as vantagens e desvantagens de cada abordagem.

Escalabilidade horizontal de software (scaling out)

Você pode dimensionar o software horizontalmente incorporando nós adicionais ao sistema para lidar com uma carga maior, pois ela será distribuída pelas máquinas. Por exemplo, se um aplicativo começar a apresentar atrasos, você poderá expandir adicionando outro servidor.

A escalabilidade horizontal é uma escolha melhor quando você não pode estimar quanta carga seu aplicativo precisará manipular no futuro. Também é uma opção ideal para software que precisa ser dimensionado rapidamente sem tempo de inatividade.

Benefícios:

  • Resiliência ao fracasso. Se um nó falhar, outros irão pegar a folga
  • Não há período de inatividade durante o dimensionamento, pois não há necessidade de desativar os nós existentes ao adicionar novos
  • Teoricamente, as possibilidades de escalar horizontalmente são ilimitadas

Limitações:

  • Complexidade adicionada. Você precisa determinar como a carga de trabalho é distribuída entre os nós. Você pode usar o Kubernetes para gerenciamento de carga
  • Custos mais altos. Adicionar novos nós custa mais do que atualizar os existentes
  • A velocidade geral do software pode ser restrita pela velocidade de comunicação do nó

Escalabilidade vertical de software (scaling up)

A escalabilidade vertical consiste em adicionar mais potência ao hardware existente. Se com escalabilidade horizontal você adicionaria outro servidor para lidar com a carga de um aplicativo, aqui você atualizará o servidor existente adicionando mais poder de processamento, memória, etc. Outra opção é remover o servidor antigo e conectar um mais avançado e capaz.

Esse tipo de escalabilidade funciona bem quando você sabe a quantidade de carga extra que precisa incorporar.

Benefícios:

  • Não há necessidade de alterar a configuração ou a lógica de um aplicativo para se adaptar à infraestrutura atualizada
  • Despesas mais baixas, pois custa menos atualizar do que adicionar outra máquina

Limitações:

  • Há tempo de inatividade durante o processo de atualização
  • A máquina atualizada ainda apresenta um único ponto de falha
  • Há um limite de quanto você pode atualizar um dispositivo

Escalabilidade vertical vs. horizontal de software

Aqui está uma tabela de comparação que fornece uma visão geral dos diferentes aspectos de ambos os tipos de escalabilidade de software.

Quando você absolutamente precisa de escalabilidade?

Muitas empresas descartam a escalabilidade na engenharia de software em favor de custos mais baixos e ciclos de vida de desenvolvimento de software mais curtos. E embora existam alguns casos em que a escalabilidade não é um atributo essencial de qualidade do sistema, na maioria das situações, você precisa considerá-la desde os estágios iniciais do ciclo de vida do produto.

Quando a escalabilidade do software não é necessária:

  • Se o software for uma prova de conceito (PoC) ou um protótipo
  • Ao desenvolver software interno para pequenas empresas usado apenas por funcionários
  • Aplicativo para celular/desktop sem back-end

Quanto ao resto, é altamente recomendável procurar opções de escalabilidade para estar pronto quando chegar a hora. E como você sabe que é hora de escalar? Quando você percebe a degradação do desempenho. Aqui estão algumas indicações:

  • O tempo de resposta do aplicativo aumenta
  • Incapacidade de lidar com solicitações simultâneas de usuários
  • Taxas de erro aumentadas, como falhas de conexão e tempos limite
  • Gargalos estão se formando com frequência. Você não pode acessar o banco de dados, a autenticação falha, etc.

Dicas para construir software altamente escalável

A escalabilidade de software é muito mais barata e fácil de implementar se considerada no início do desenvolvimento de software. Se você precisar dimensionar inesperadamente sem realizar as etapas necessárias durante a implementação, o processo consumirá muito mais tempo e recursos. Uma dessas abordagens é refatorar o código, o que é um esforço duplicado, pois não adiciona novos recursos. Ele simplesmente faz o que deveria ter sido feito durante o desenvolvimento.

Abaixo, você encontrará oito dicas que o ajudarão a criar um software mais fácil de escalar no futuro. A tabela abaixo divide as dicas em diferentes etapas de desenvolvimento de software.

Dica nº 1: Opte por hospedagem na nuvem para melhor escalabilidade do software

Você tem duas opções para hospedar seus aplicativos, na nuvem ou no local. Ou você pode usar uma abordagem híbrida.

Se você optar pelo modelo local , contará com sua própria infraestrutura para executar aplicativos, acomodar seu armazenamento de dados etc. Essa configuração limitará sua capacidade de dimensionamento e o tornará mais caro. No entanto, se você opera em um setor altamente regulamentado, pode não ter escolha, pois a hospedagem local oferece mais controle sobre os dados.

Além disso, em alguns setores, como o bancário, o tempo de processamento da transação é essencial e você não pode esperar que a nuvem responda ou tolerar qualquer tempo de inatividade dos provedores de nuvem. As empresas que operam nesses setores estão restritas ao uso de hardware específico e não podem confiar em qualquer oferta de provedores de nuvem. O mesmo vale para aplicativos de missão crítica sensíveis ao tempo, como veículos automatizados.

Escolher serviços de computação em nuvem lhe dará a possibilidade de acessar recursos de terceiros em vez de usar sua infraestrutura. Com a nuvem, você tem uma possibilidade quase ilimitada de aumentar e diminuir sem precisar investir em servidores e outros hardwares. Os fornecedores de nuvem também são responsáveis ​​por manter e proteger a infraestrutura.

Se você trabalha no setor de saúde, pode conferir nosso artigo sobre computação em nuvem no setor médico.

Dica #2: Use balanceamento de carga

Se você decidir escalar horizontalmente, precisará implantar um software de balanceamento de carga para distribuir as solicitações recebidas entre todos os dispositivos capazes de lidar com elas e garantir que nenhum servidor fique sobrecarregado. Se um servidor cair, um balanceador de carga redirecionará o tráfego do servidor para outras máquinas online que possam lidar com essas solicitações.

Quando um novo nó é conectado, ele automaticamente se torna parte da configuração e também começa a receber solicitações.

Dica nº 3: Armazene o máximo que puder

O cache é usado para armazenar conteúdo estático e resultados pré-calculados que os usuários podem acessar sem a necessidade de fazer cálculos novamente.

Armazene em cache o máximo de dados possível para aliviar a carga do seu banco de dados. Configure sua lógica de processamento de forma que os dados que raramente são alterados, mas lidos com bastante frequência, possam ser recuperados de um cache distribuído. Isso será mais rápido e mais barato do que consultar o banco de dados a cada solicitação simples. Além disso, quando algo não está no cache, mas é acessado com frequência, seu aplicativo irá recuperá-lo e armazenar em cache os resultados.

Isso traz problemas, como com que frequência você deve invalidar o cache, quantas vezes um dado precisa ser acessado para ser copiado para o cache etc.

Dica nº 4: habilite o acesso por meio de APIs

Os usuários finais acessarão seu software por meio de uma variedade de clientes e será mais conveniente oferecer uma interface de programação de aplicativo (API) que todos possam usar para se conectar. Uma API é como um intermediário que permite que dois aplicativos conversem. Certifique-se de considerar diferentes tipos de clientes, incluindo smartphones, aplicativos de desktop, etc.

Lembre-se de que as APIs podem expor você a vulnerabilidades de segurança. Tente resolver isso antes que seja tarde demais. Você pode usar gateways seguros, autenticação forte, métodos de criptografia e muito mais.

Dica nº 5: Beneficie-se do processamento assíncrono

Um processo assíncrono é um processo que pode executar tarefas em segundo plano. O cliente não precisa esperar pelos resultados e pode começar a trabalhar em outra coisa. Essa técnica permite a escalabilidade do software, pois permite que os aplicativos executem mais threads, permitindo que os nós sejam mais escaláveis ​​e manipulem mais carga. E se uma tarefa demorada entrar, ela não bloqueará a ameaça de execução e o aplicativo ainda poderá lidar com outras tarefas simultaneamente.

O processamento assíncrono também consiste em dividir os processos em etapas, quando não há necessidade de esperar que uma etapa seja concluída antes de iniciar a próxima, se isso não for crítico para o sistema. Essa configuração permite distribuir um processo em vários threads de execução, o que também facilita a escalabilidade.

O processamento assíncrono é obtido no nível do código e da infraestrutura, enquanto a manipulação de solicitação assíncrona é no nível do código.

Dica nº 6: Opte por tipos de banco de dados mais fáceis de dimensionar, quando possível

Alguns bancos de dados são mais fáceis de dimensionar do que outros. Por exemplo, bancos de dados NoSQL, como o MongoDB, são mais escaláveis ​​que o SQL. O mencionado MongoDB é de código aberto e normalmente é usado para análise de big data em tempo real. Outras opções NoSQL são Amazon DynamoDB e Google Bigtable.

O SQL tem um bom desempenho quando se trata de escalar as operações de leitura, mas para nas operações de gravação devido à sua conformidade com os princípios do ACID (atomicidade, consistência, isolamento e durabilidade). Portanto, se esses princípios não forem a principal preocupação, você pode optar pelo NoSQL para facilitar o dimensionamento. Se você precisar contar com bancos de dados relacionais, para consistência ou qualquer outro assunto, ainda é possível escalar usando sharding e outras técnicas.

Dica nº 7: escolha microsserviços em vez de arquitetura monolítica, se aplicável

arquitetura monolítica

O software monolítico é construído como uma única unidade que combina operações do lado do cliente e do lado do servidor, um banco de dados, etc. Tudo está fortemente acoplado e possui uma única base de código para todas as suas funcionalidades. Você não pode atualizar apenas uma parte sem afetar o restante do aplicativo.

É possível dimensionar o software monolítico, mas ele deve ser dimensionado de forma holística usando a abordagem de dimensionamento vertical, que é cara e ineficiente. Se você deseja atualizar uma parte específica, não há como escapar da reconstrução e reimplantação de todo o aplicativo. Portanto, opte por um monolítico se sua solução não for complexa e for usada apenas por um número limitado de pessoas.

Arquitetura de microsserviços

Os microsserviços são mais flexíveis que os monólitos. Os aplicativos projetados nesse estilo consistem em muitos componentes que funcionam juntos, mas são implantados de forma independente. Cada componente oferece uma funcionalidade específica. Os serviços que constituem um aplicativo podem ter diferentes pilhas de tecnologia e acessar diferentes bancos de dados. Por exemplo, um aplicativo de comércio eletrônico criado como microsserviços terá um serviço para pesquisa de produtos, outro para perfis de usuário, outro para gerenciamento de pedidos e assim por diante.

Os componentes de aplicativos de microsserviço podem ser dimensionados independentemente sem sobrecarregar todo o software. Então, se você está procurando uma solução escalável, os microsserviços são o seu design ideal. A alta escalabilidade de software é apenas uma das muitas vantagens que você pode obter com essa arquitetura. Para mais informações, confira nosso artigo sobre os benefícios dos microsserviços.

Dica nº 8: Monitore o desempenho para determinar quando dimensionar

Após a implantação, você pode monitorar seu software para detectar os primeiros sinais de degradação do desempenho que podem ser resolvidos com o dimensionamento. Isso lhe dá a oportunidade de reagir antes que o problema se agrave. Por exemplo, quando você percebe que a memória está baixa ou que as mensagens estão esperando para serem processadas por mais tempo do que o limite especificado, isso é uma indicação de que seu software está sendo executado em sua capacidade.

Para poder identificar esses e outros problemas relacionados à escalabilidade de software, você precisa incorporar um sistema de monitoramento de telemetria em seu aplicativo durante a fase de codificação. Este sistema permitirá que você rastreie:

  • Tempo médio de resposta
  • Taxa de transferência, que é o número de solicitações processadas em um determinado momento
  • O número de usuários simultâneos
  • Métricas de desempenho do banco de dados, como tempo de resposta da consulta
  • Utilização de recursos, como CPU, uso de memória, GPU
  • Taxas de erro
  • Custo por usuário

Você pode se beneficiar de soluções de monitoramento existentes e estruturas de agregação de log, como Splunk. Se o seu software estiver sendo executado na nuvem, você poderá usar a solução do fornecedor da nuvem. Por exemplo, a Amazon oferece o AWS CloudWatch para essa finalidade.

Exemplos de soluções de software escaláveis ​​do portfólio ITRex

Espelho de fitness inteligente com um treinador pessoal

Descrição do Projeto

O cliente queria construir um espelho fitness de parede de corpo inteiro que auxiliasse os usuários em sua rotina de exercícios. Ele pode monitorar a forma do usuário durante o exercício, contar as repetições e muito mais. Este sistema deveria incluir um software que permitisse aos treinadores criar e enviar vídeos e aos usuários gravar e gerenciar seus treinos.

O que fizemos para garantir a escalabilidade do software

  • Optamos pela arquitetura de microsserviços
  • Escalabilidade horizontal implementada para distribuição de carga. Um novo nó era adicionado sempre que havia muita carga nos existentes. Assim, sempre que o uso da CPU excedesse 90% de sua capacidade e permanecesse lá por um período de tempo especificado, um novo nó seria adicionado para aliviar a carga.
  • Tivemos que implantar bancos de dados relacionais — ou seja, SQL e PostgreSQL — por motivos de arquitetura. Embora os bancos de dados relacionais sejam mais difíceis de dimensionar, ainda existem várias opções. No início, como a base de usuários ainda era relativamente pequena, optamos pelo escalonamento vertical. Se o público aumentasse, planejávamos implantar a abordagem mestre-escravo — distribuindo os dados em vários bancos de dados.
  • Beneficiou-se amplamente do armazenamento em cache, pois este sistema contém muitas informações estáticas, como nomes de treinadores, títulos de exercícios, etc.
  • RestAPI usado para processamento de solicitação assíncrona entre o aplicativo de treino e o servidor
  • Baseou-se na arquitetura sem servidor, como AWS Lambda, para outros tipos de processamento assíncrono. Um exemplo é o processamento de vídeo assíncrono. Depois que um treinador carrega um novo vídeo de treino e o segmenta em diferentes exercícios, ele pressiona “salvar” e o servidor começa a processar esse vídeo para transmissão ao vivo HTTP para construir quatro versões do vídeo original com diferentes resoluções. O treinador pode fazer upload de novos vídeos simultaneamente.
  • Em outro exemplo, o sistema executa de forma assíncrona o corte inteligente nos vídeos do usuário para remover todas as partes em que o usuário estava inativo.

Sistema de cibersegurança baseado em biometria

Descrição do Projeto

O cliente queria construir uma plataforma de segurança cibernética que permitisse às empresas autenticar funcionários, contratados e outros usuários com base na biometria e evitar senhas e PINs. Essa plataforma também conteria uma ferramenta de vídeo ao vivo para confirmar remotamente a identidade do usuário.

Como garantimos que este software fosse escalável

  • Usamos uma arquitetura descentralizada de microsserviços
  • Implantou três balanceadores de carga para distribuir a carga entre diferentes microsserviços
  • Algumas partes dessa plataforma eram autoescaláveis ​​por design. Se a carga ultrapassasse um determinado limite, uma nova instância de um microsserviço era criada automaticamente
  • Usamos seis bancos de dados diferentes — quatro PostgreSQLs e dois MongoDBs. Os bancos de dados PostgreSQL foram dimensionados verticalmente quando necessário. Ao projetar a arquitetura, percebemos que alguns dos bancos de dados teriam que ser dimensionados com bastante frequência, então adotamos o MongoDB para essa finalidade, pois são mais fáceis de dimensionar horizontalmente.
  • Processamento assíncrono implantado para melhor experiência do usuário. Por exemplo, o pós-processamento de vídeo foi feito de forma assíncrona.
  • Optamos pelo algoritmo de reconhecimento facial de um provedor de serviços terceirizado. Então, fizemos questão de selecionar uma solução que já fosse escalável e incorporá-la à nossa plataforma por meio de uma API.

Desafios que você pode encontrar durante o dimensionamento

Se você pretende planejar a escalabilidade do software durante o desenvolvimento do aplicativo e deseja incorporar as dicas acima, ainda poderá enfrentar os seguintes desafios:

  • Dívida técnica acumulada . As partes interessadas do projeto ainda podem tentar marginalizar a escalabilidade em favor de custos mais baixos, velocidade, etc. A escalabilidade não é um requisito funcional e pode ser ofuscada por características mais tangíveis. Como resultado, o aplicativo acumulará recursos técnicos que não serão compatíveis com a escalabilidade.
  • Escalando com metodologia de desenvolvimento Agile . A metodologia ágil tem tudo a ver com abraçar a mudança. No entanto, quando o cliente deseja implementar muitas alterações com muita frequência, a escalabilidade do software pode ser deixada de lado para acomodar as demandas em constante mudança.
  • Teste de escalabilidade . É difícil realizar testes de carga realistas. Digamos que você queira testar como o sistema se comportará se você aumentar o tamanho do banco de dados 10 vezes. Você precisará gerar uma grande quantidade de dados realistas, que correspondam às suas características de dados originais e, em seguida, gerar uma carga de trabalho realista para gravações e leituras.
  • Escalabilidade de serviços de terceiros . Certifique-se de que seu provedor de serviços terceirizado não limite a escalabilidade. Ao selecionar um fornecedor de tecnologia, verifique se ele pode oferecer suporte ao nível pretendido de escalabilidade de software e integrar sua solução corretamente.
  • Entendendo o uso do seu aplicativo . Você precisa ter uma visão sólida de como seu software funcionará e quantas pessoas o utilizarão, o que raramente é possível estimar com precisão.
  • Restrições arquitetônicas . Às vezes você está limitado em suas escolhas arquitetônicas. Por exemplo, você pode precisar usar um banco de dados relacional e terá que lidar com o dimensionamento horizontal e vertical.
  • Ter o talento certo . Para projetar uma solução escalável que não lhe dará dor de cabeça no futuro, você precisa de um arquiteto experiente que tenha trabalhado em projetos semelhantes antes e que entenda a escalabilidade de software tanto da perspectiva de codificação quanto da infraestrutura. Aqui no ITRex Group, trabalhamos em muitos projetos e sempre mantemos a escalabilidade em mente durante o desenvolvimento de software.

Resumindo

A menos que você tenha certeza absoluta de que não precisará escalar, considere a escalabilidade do software nos estágios iniciais de desenvolvimento e tome as precauções necessárias. Mesmo se você estiver limitado em suas escolhas arquitetônicas e nem sempre puder implementar a opção mais escalável, ainda assim saberá onde estão os obstáculos e terá tempo para considerar alternativas.

Deixar a escalabilidade de lado por causa de outros requisitos funcionais pode sair pela culatra. Primeiro, a empresa lutará contra a degradação do desempenho. Levará muito tempo para processar as solicitações. Os usuários terão atrasos inaceitáveis. Depois de tudo isso, a empresa vai escalar pagando o dobro e o triplo do valor que poderia ter sido gasto nas fases anteriores.

Está pensando em implantar um novo software corporativo ou atualizar um sistema existente, mas teme que ele não acompanhe as necessidades de negócios em rápida expansão? Entrar em contato! Garantiremos que seu software não apenas tenha todas as funcionalidades necessárias, mas também possa ser dimensionado com investimento e tempo de inatividade mínimos.


Originalmente publicado em https://itrexgroup.com em 24 de julho de 2023.