Este repositório contém uma coleção de projetos desenvolvidos como parte da disciplina de Sistemas Distribuídos (OPT021) ministrada pelo professor Dr. Rodrigo Campiolo.
O diretório Projetos contém alguns dos projetos práticos de codificação desenvolvidos. Enquanto que o diretório Atividades teóricas contém algumas atividades conceituais relacionadas a sistemas distribuídos.
A seguir, neste documento, é apresentada a lista de projetos práticos com uma visão geral sobre cada um deles. Na sequência, também é dada uma visão geral sobre as atividades teóricas realizadas.
Ao acessar o diretório Projetos
, verá-se uma lista de todos os projetos. Dentro de cada pasta respectiva a um projeto, encontra-se não só a especificação daquele trabalho, mas também um arquivo README.md
com mais detalhes a respeito dele.
Este projeto implementa dois protocolos de comunicação TCP, a saber, Protocolo Binário e Protocolo Textual. Ambos, por meio da linguagem de programação Java, suportam a conexão de múltiplos processos clientes ao processo servidor com a utilização de threads.
- Protocolo Binário: A transmição dos dados entre os processos cliente e servidor é realizada byte a byte. O servidor implementa a gerência de um conjunto de arquivos remotos entre múltiplos processos clientes.
- Protocolo Textual: A transmição dos dados entre os processos cliente e servidor é feita no formato de string. O servidor implementa o controle de mensagens e áreas de usuários distintos, através de um "login" com usuário e senha.
Este trabalho contempla dois projetos. Ambos implementam, com a linguagem de programação Java, a comunicação entre processos através de sockets UDP.
-
Sistema de Backup de Arquivos: O processo cliente envia os dados de um arquivo a ser transmitido para um servidor remoto. Os dados são enviados em blocos de 1024 bytes. O servidor verifica a integridade por meio de um checksum
SHA-1
e salva o arquivo. -
Chat Peer-to-Peer: Permite com que os processos peers troquem mensagens entre si. Ao serem transmitidas, as mensagens seguem um protocolo e podem ser de diferentes tipos: normal, emoji, URL ou ECHO.
A fim de colocar em prática os conceitos de Representação Externa de Dados, este projeto utiliza Google Protocol Buffers para gerar as estruturas e APIs que viabilizam a comunicação em um sistema distribuído heterogêneo de arquitetura cliente-servidor.
Nesse sentido, o servidor e o cliente, respectivamente, são implementados nas linguagens de programação Python e Java.
O objetivo do serviço é implementar as funcionalidades para o gerenciamento de filmes usando os dados providos pela coleção movies da base de dados Mflix do MongoDB.
Com o objetivo de praticar os conceitos acerca de Remote Procedure Call (RPC), este projeto utiliza a biblioteca Google RPC (gRPC) para definir uma interface de serviço que proporciona a integração em um sistema distribuído heterogêneo de arquitetura cliente-servidor.
Através da IDL Protocol Buffers, são definidas interfaces de serviço e as operações que podem ser chamadas remotamente. O servidor Python implementa essas operações e o cliente Java as utiliza como se fossem chamadas locais - mas na verdade são realizadas remotamente e de forma transparente para o programador.
Este projeto utiliza um modelo de comunicação indireta com publish-subscribe e fila de mensagens para implementar um serviço de notificação de tweets. Está disponível neste repositório.
O componente coletor coleta tweets por meio de palavras-chave que descrevem os tópicos de interesse. Em seguida ele envia os tweets para uma fila de um serviço de mensagens (neste caso, o RabbitMQ). Os classificadores consomem os tweets da fila e processam as mensagens para identificar qual o tópico do tweet e os publicam atavés do serviço de mensagens naquele tópico. Dessa forma, os assinantes são notificados com os tweets de interesse.
O trabalho final visa desenvolver uma aplicação que proveja ao menos uma característica de sistemas distribuídos. Optamos por criar um sistema que provê escalabilidade horizontal através de uma arquitetura de microserviços. Ou seja, para lidar com o aumento da demanda, o sistema seria capaz de adicionar mais instâncias de um serviço. A descrição arquitetural e o próprio projeto estão disponíveis neste repositório.
O sistema emprega o Nginx como balanceador de carga. Os microserviços de usuário, autenticação e publicação foram desenvolvidos com o framework NestJS (em Typescript) e o banco de dados com PostgreSQL. Além disso, também foi utilizado o serviço de mensagens RabbitMQ e teve seu front-end implementado com React.
Confira a seguir a lista de algumas das atividades teóricas elaboradas durante a disciplina com um breve panorama a respeito de cada uma delas.
Com base no artigo The NIST Definition of Cloud Computing: Recomendations of the National Institute of Standards and Technology, o documento discorre sobre três perguntas relacionadas às características de computação em nuvem e de sistemas distribuídos, abordando conceitos como middleware, dimensões de escalabilidade, tipos de sistemas distribuídos, entre outros.
Por meio do artigo Architecture Styles do Centro de Arquitetura Azure, buscou-se compreender estilos de arquiteturas de software. Entre os tópicos abordados estão: Big Compute, Big Data, Event-Driven Architecture, Microservices, N-tier Application e Web-Queue Worker.
Este trabalho buscou elucidar os principais aspectos acerca do GFS, o sistema de arquivos distribuído do Google. Baseando-se no próprio artigo original The Google File System, o documento, em primeira análise, contextualiza o leitor, na sequência, aborda alguns conceitos chaves e, finalmente, descreve o papel dos principais componentes arquiteturais do sistema.
Com o intuito de estudar sobre o conceito de Invocação Remota no contexto de Sistemas Distribuídos, este documento resume os principais aspectos sobre chamada de procedimento remoto (RPC) e invocação de método remoto (RMI). O conteúdo foi obtido dos livros:
- COULOURIS et al., 2013, Sistemas distribuídos: conceitos e projeto;
- STEEN, Maarten van; TANENBAUM, Andrew S.. Distributed Systems, 4. ed.
Como parte do seminário em tópicos de sistemas distribuídos, este documento, baseado no artigo Chord: A Scalable Peer-to-Peer Lookup Service for Internet Applications, apresenta uma visão ampla dos principais aspectos do protocolo proposto pelos autores. O texto resumido inicia com uma breve contextualização a respeito de sistemas peer-to-peer e serviços de lookup. Na sequência descreve a base do protocolo Chord, percorrendo tabelas hash distribuídas, o sistema de lookup e finger tables, entre outros aspectos como escalabilidade e tolerência a falhas.