Design de Sistemas Distribuídos — Introdução a Design de Sistemas e Sistemas Distribuídos

Italo Santana
Comunidade XP
Published in
5 min readDec 6, 2019

--

Bem vindos ao primeiro capítulo da série sobre Design de Sistemas e Sistemas Distribuídos!

Você pode ler o artigo de apresentação da série aqui.

WIKIPEDIA: Design de sistemas é o processo de definição da arquitetura, módulos, interfaces e dados de um sistema para atender aos requisitos especificados.

Após essa breve definição sobre Design de Sistemas, podemos complementar que além disso, trata-se de utilizar técnicas e conceitos de ciências da computação, como redes de computadores, sistemas distribuídos e computação paralela para gerar sistemas/soluções em larga escala como os grandes players do mercado tecnológico Google, Amazon, Facebook, etc.

Um das áreas mais importantes que embasam o design de sistemas, é a computação distribuída (campo da ciência da computação que estuda sistemas distribuídos).

TANENBAUM: Um sistema distribuído é um conjunto de computadores independentes que se apresenta a seus usuários como um sistema único e coerente.

Um programa de computador que é executado em um sistema distribuído é chamado de programa distribuído e é desenvolvido através de programação distribuída (claro), utilizando diferentes tipos de implementações e mecanismos de troca de mensagens.

Podemos citar desde HTTP, RPC, até Filas de Mensagens — Message Queues (criarei um artigo da série para falar sobre) para que interajam entre si e realizem uma determinada tarefa.

Na primeira parte desta série, vamos conhecer alguns dos conceitos, características e desafios mais importantes e que todo engenheiro de software deve ter em mente ao pensar no design de sistemas distribuídos.

1 — Disponibilidade (Availability)

Um simples exemplo de arquitetura distribuída

Ao falar de disponibilidade, estamos comparando a quantidade de tempo que um sistema está realmente operando versus a porcentagem do tempo total que deveria estar operando.

Um sistema altamente disponível permite que o mesmo permaneça operacional mesmo quando ocorrem falhas.

Seu tempo de indisponibilidade é tão baixo, que chega a ser quase que nulo, por exemplo, minutos ou horas de inatividade por ano.

A disponibilidade de um sistema é normalmente fornecida em porcentagem do tempo em que um sistema deve estar disponível, por exemplo: 99,999% do tempo proposto.

2 — Confiabilidade (Reliability)

A confiabilidade de um sistema é medida pela probabilidade desse sistema produzir saídas confiáveis/consistentes.

Um sistema confiável, em caso de falha, não continua silenciosamente e fornece resultados que incluem dados corrompidos/não consistentes.

Em vez disso, ele detecta e, se possível, corrige a corrupção, por exemplo: repetindo uma operação para erros transacionais ou intermitentes, ou então para erros incorrigíveis, isolando a falha e relatando-a a mecanismos de recuperação de nível superior (disparando um processo de failover ou rollback de transação, por exemplo).

3 — Concorrência Distribuída (Distributed Concurrency)

Concorrência é uma propriedade de um sistema que representa o fato de que várias atividades são executadas ao mesmo tempo.

A execução simultânea de atividades pode ocorrer em diferentes ambientes, como processadores de núcleo único, processadores de múltiplos núcleos, multiprocessadores, mas não é esse tipo de processo concorrente que vamos abordar aqui, no nosso caso, trataremos de execução simultânea de tarefas em várias máquinas, como parte de um sistema distribuído.

No entanto, todos partilham dos mesmos desafios: fornecer ferramentas para controlar os diferentes fluxos de execução por meio de coordenação e sincronização, garantindo a consistência destes.

Utilizando o exemplo de um site de e-commerce: Imagine um produto com estoque de apenas 1 unidade sendo concorrido por milhares de usuários simultaneamente em um fim de semana de black friday…

Em ambiente concorrente, cada recurso/serviço/nó deve ser projetado para manter a consistência nos estados de seus dados.

No caso do e-commerce: devemos garantir a consistência dessas transações/operações e o sistema não deve permitir, por exemplo, que após a venda deste último produto, nenhum outro pedido seja realizado simultaneamente, pois não existe estoque para tal.

4 — Tolerância á Falhas (Fault tolerance)

Qualquer computador ou rede pode falhar. A questão sobre a premissa de tolerância a falhas é justamente a forma com que cada componente vai responder a esta.

Cada componente do sistema que depende de outrem devem conhecer os vários recursos passíveis a falhas e ser projetado para tratar cada uma dessas falhas apropriadamente.

Sistema em perfeito funcionamento
Exemplo de Tratamento de Falha — Ocorreu falha em um dos nós e o tráfego foi transferido para outra instância de redundância do mesmo serviço

5 — Escalabilidade (Scalability)

Considera-se um sistema distribuído escalável, quando o custo de adição de usuários seja um valor constante em termos dos recursos que devem ser adicionados.

Em outras palavras: É a capacidade de um sistema entregar um desempenho satisfatório diante de um crescimento drástico de carga aliado a um aumento de custos que não inviabilize o negócio.

Exemplo de Escalonamento Horizontal — Baixa Carga, menos nós/servidores provisionados
Exemplo de Escalonamento Horizontal — Aumento da carga, mais nós/servidores são adicionados ao sistema

O termo carga, pode ser traduzido tecnicamente em parâmetros que melhor se adequem ao contexto abordado.

Por exemplo: Para um site e-commerce, o número desejável de gravações (compras realizadas pelos usuários) por segundo, o número de leituras (pesquisas por produtos) por segundo, podem ser utilizados para definir o conceito de carga.

Dentre os tipos de escalonamento, podemos citar: Escalonamento Vertical e Escalonamento Horizontal, que serão o tema do próximo artigo da série.

Você pode ler o próximo artigo da série aqui:

2 — Design de Sistemas Distribuídos — Escalonamento Vertical e Horizontal

--

--

Italo Santana
Comunidade XP

Arquiteto de Software apaixonado por tecnologia e inovação. Atualmente Tech Lead na XP Inc.