Cache Hash com comunicação TCP entre servidores-cache e cache-cliente

Relatório do trabalho para a disciplina Redes de Computadores 2

Aluno: Vinicius Gabriel Machado (GRR20182552)

Professor: Elias P. Duarte Jr.

Departamento de Informática - Bacharelado em Ciência da Computação (BCC) - UFPR

Abril 2022



Por favor, não visualizar em um ambiente mobile.



Descrição do trabalho:


- Link para o site do professor



Fluxo de Execução:


- Inicialização:


Primeiramente os 3 servidores são inicializados. Depois disso a cache é inicializada e por fim, o cliente.


python3 server.py 1

python3 server.py 2

python3 server.py 3


python3 cache.py


python3 client.py


- Solicitação por um dado:


Na interface do cliente é solicitado qual dado de temperatura o usuário deseja verificar.

A entrada esperada é um número entre 1 e 3, com a seguinte equivalência:


1 - Dado de temperatura do servidor da Antártida

2 - Dado de temperatura do servidor do Deserto de Atacama

3 - Dado de temperatura do servidor do Monte Everest


- Processamento da solicitação:


Inicialmente o cliente envia o id do servidor, que deseja saber o dado de temperatura, para a cache.

A cache por sua vez consulta a sua tabela hash contendo o dado registrado da última consulta e o momento de realização da última consulta.


Há duas circunstâncias:


1 - Se a última consulta tiver sido feita há 30 segundos, o dado é coletado da tabela hash e enviado ao cliente, que exibe ao usuário.


2 - Se a última consulta tiver mais de 30 segundos, o dado é solicitado ao servidor correspondente por meio do envio de uma flag: get_data.

O servidor por sua vez gera um novo dado aleatório de acordo com o range de temperatura adequado e envia à cache uma string já formatada.

A cache então envia ao cliente, que exibe ao usuário.



Detalhes da implementação:


- Linguagem utilizada:


Python.


- Bibliotecas:


socket, sys, time e secrets.


- Host:


localhost


- Portas:


42111, 42222 e 42333.


- Ranges de temperatura:

Antartida: fim: -10 e início: -60

Deserto de Atacama: fim: 32 e início: -2

Monte Everest: fim: -19 e início: -3



Arquivos:


- Fluxo de execução de exemplo para os logs:


fluxo.txt


- Logs:


server1.log.txt

server2.log.txt

server3.log.txt

cache.log.txt

client.log.txt


- Implementação:

server.py.txt

cache.py.txt

client.py.txt



Diário de implementação:


1 - Criada conexão client e cache de teste para a manipulação do socket, com operação de envio e recebimento de um unico dado

2 - Organização do código em funções e métodos

3 - Definição de uma cache com os campos: segundo de acesso, dado e porta do servidor que contêm o dado para quando for feita a consulta (ainda não foi feito os servidores)

4 - Implementação de uma interface para o cliente solicitar dado do servidor que for de interesse (utilizando apenas o client no momento)

5 - Realização da conexão com a cache, solicitando o dado de acordo com a entrada do usuário

6 - Teste de leitura, armazenando valores aleatórios na cache (sem conectar com os servidores ainda) com tempo de validade

7 - Implementação dos servidores com uma porta diferente para cada (com o mesmo arquivo python diferenciando na linha de comando os servidores)

8 - Conexão dos servidores com a cache

9 - Alteração do método de acesso aos dados, usando agora os servidores conectados

10 - Criação de um dicionário próprio para os dados dos servidores (porta e conexão), removendo da cache

11 - Adição de comentários no código

12 - Adaptação do código de geração de números aleatórios, usando um range definido para cada servidor

13 - Criação de mensagens de log

14 - Adição de timestamps para os logs