Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Sistemas Distribuídos
O que é um Sistema Distribuído?
“Um Sistema Distribuído é um conjunto de computadores independentes que se apresenta a seus usuários de maneira única e coerente”, ou seja, um sistema composto por vários computadores mas que mesmo assim parece que é apenas um único sistema.
Metas e Desafios
Sistemas Distribuído devem atingir as seguintes quatro metas (não necessariamente precisa ser feito em um bom nível, pode ser apenas cumprido superficialmente, mas deve ser cumprido):
Acesso a Recursos
Transparência de distribuição
Existem momentos em que ocultar totalmente do usuário não é uma boa ideia, visar a transparência de distribuição pode ser bom para um sistema, porém deve ser levado em conta aspectos como desempenho, por exemplo. Será que vale a pena fazer a replicação de recursos complexos constantemente do Japão para o Brasil e vice-versa?
Abertura
Um Sistema Distribuído Aberto é um sistema que oferece serviços de acordo com regras padronizadas que descrevam a semântica e sintaxe desses serviços, no qual são especificados por meio de interfaces em uma linguagem de definição de interface (Interface Definition Language).
Especificações adequadas são completas e neutras.
Ambas essas caracteristicas são importantes para Interoperabilidade e Portabilidade;
Um sistema distribuido aberto também deve ser extensível, ou seja, deve ser fácil para adicionar partes que são executadas em um sistema operacional diferente.
Escalabilidade
Como a conectividade mundial pela internet vem se tornando muito comum, a escalabilidade é uma meta importante para um sistema distribuído. Escalabilidade essa que pode ser medida em três dimensões:
É necessário resolver problemas quando se trata de ampliação de sistemas, considerando a escalabilidade em relação ao tamanho: para suportar mais usuários e recursos, os serviços, os dados e os algoritmos centralizados ficam muito limitados.
💡 Antes de seguir, **o que são Serviços, Dados e Algoritmos Centralizados?** Serviços Centralizados: Serviços fornecidos por uma única entidade, por exemplo, um único servidor para todos os usuário; Dados Centralizados: Está relacionado a prática de adicionar todos os dados em um único local ou em conjunto de locais controlados por uma única entidade, por exemplo, uma lista telefônica online; Algorítmos Centralizados: São algoritmos de processamentos de dados (ou também inteligências artificiais que são executados em um único local, por exemplo, o sistema de recomendação da Amazon, do Youtube, o Google Search e etc.O problema fica evidente quando nos tratamos de ambientes centralizados, uma vez que a quantidade de usuários e recursos aumentando faz com que o único servidor apresente gargalos.
Protocolos
Regra de Comunicação é como eu vou construir uma mensagem, empacota-la, enviar essa mensagem e do outro lado, desempacotar.
Protocolo HTTP é composto por Header e Body (e uma linha em branco pra separar os dois).
(Composição HTTP e REST)
(Estrutura de comunicação de sistemas)
Os sistemas de baixo possuem a mesma regra de comunicação, uma das opções de conversas entre eles é o Cliente-Servidor
Sistemas Computacionais Diferentes
Sistemas computacionais diferentes possuem regras de comunicações diferentes, como elas conversam entre si? Através de conversores de dados.
Solução Cliente-Servidor
Em um Cliente-Servidor ligado ao REST, é necessário programar a comunicação entre ambos.
Requisição e Resposta
resp = f(req)
A resposta é o resultado de uma função f tal que a minha solicitação é o parâmetro requisição.
Em computação - CHAMADA REMOTA
Servidor s = Servidor.req(característica)
resp = s.send(informação)
Outro exemplo:
CLIENTE
resp = soma(A, B)
SERVIDOR
soma(x,y) {
return x + y
}
Antes:
CLIENTE —REQ—> SERVIDOR
SERVIDOR —RESP—> CLIENTE
Depois:
CLIENTE —REQ—> MIDDLEWARE —> SERVIDOR
SERVIDOR —RESP—> MIDDLEWARE —> CLIENTE
Middleware que faz as conversões de um lado para o outro.
Revisão - Protocolos
Como o Cliente e o Servidor se conversam? Via HTTP
Desenho de uma arquitetura HTTP:
Desenho da estrutura de uma mensagem HTTP:
GET / HTTP/1.1
HOST: blahost
/n
Language: PT-BR
Nesse caso: http://blahost:8080/
URL: http://blahost:8080 >> / <<
Por isso que podemos converter o seguinte URL:
http://blahost:8080/minhaprimeirapagina.html
Para a requisição:
GET /minhaprimeirapagina.html HTTP/1.1
📌 Quais são as **Portas padrões?** Porta padrão HTTP: 80Porta padrão HTTPS: 443
Porta é obrigatório no protocolo TCP/IP
HTTP/1.1 200 OK
Content-Type: <Tipo do conteúdo que estou enviando>
Content-Lenght: <Tamanho do conteúdo>
/n
Body <Conteúdo em Si>
HTTP/1.1 404 Not Found
/n
Referências:
Anotações das Aulas de Sistemas Distribuídos - 7º Ciclo de Ciência da Computação - Semestre 1/2024 - Centro Universitário FEI
Livro: Andrew S. TANENBAUM, Maarten Van Steen - Distributed Systems: Principles and Paradigms, 2nd Edition, Pearson - Prentice Hall, 2007