\ GamesBI - Documentação

Especificação



Documento de Arquitetura

Sumário

1. Introdução


1.1 Finalidade

Este documento mostra uma visão geral sobre a arquitetura e ferramentas utilizadas no projeto GamesBI.

1.2 Escopo

Neste documento serão retratados os modelos arquiteturais implementados, descrição e utilização de frameworks que compõe o projeto GamesBI, plataforma de business intelligence com temática de jogos digitais. Exploramos de maneira detalhada o funcionamento e a visão arquitetural do projeto.

1.3 Definições, acrônimos e abreviações

  • REST - Representational State Transfer
  • ETL - Extract, transform, load
  • DW / DWH - Data Warehouse
  • BI - Business Intelligence

1.4 Referências

1.5 Visão Geral

O presente documento faz o detalhamento e descrição de características da arquitetura escolhidas pela equipe. Estaremos descrevendo o padrão de arquitetura de Microserviços e APIs Rest, assim como detalhando o funcionamento da comunicação entre os microserviços e a representação dos dados

2. Representação da Arquitetura


A arquitetura do projeto possuirá ambientes diferentes: API's REST, por debaixo do framework Django, ambiente WEB de interação com usuário, feito em react e por último o worker de extração Importer. Juntando todos os ambientes e coordenando-os, formamos assim uma arquitetura de Microserviços integrada que tem como objetivo formar um processo de ETL e Data Warehouse para que no fim sejam apresentados dados conscistentes e relevantes para o nosso usuário final.


2.1 Arquitetura de Microserviços

arquitetura orientada a micro serviços foi adotada para este projeto devido a suas vantagens em relação a estrutura monolítica, dentre elas estão:

  • Disponibilização de novos processos ou serviços sem impacto nos processos e serviços existentes.
  • Alterações em processos e serviços sem a necessidade de parada de todo o sistema.
  • Otimização da utilização da infraestrutura de nuvem.
  • Redução da complexidade de manutenção.

2.2 Processo de ETL



Quando se trata de BI, o processo de ETL pode ser fundamental e necessário. É a etapa que mais exige esforço e trabalho dos envolvidos, e não foi diferente dentro da GamesBI.
O ETL trata-se do processo de extração, tratamento e carregamento dos dados. O primeiro passo, a extração, são obtidos e extraídos os dados de múltiplas fontes externas ou internas. Esses dados podem vir de diferentes e variadas formas, em consequência disso, os dados obtidos podem muitas vezes ser incompatíveis com as regras de negócio, inconsistentes ou irrelevantes. Então, na parte de tratamento, são resolvidos essas inconsistências e ocorre a integração dos dados, para que se tornem homogêneos e façam sentido juntos. Ao final do processo, os dados tratados então podem ser carregados em um Data Warehouse, um armazenamento de dados, aonde estarão disponíveis para a fase de analytics.
A arquitetura do GamesBI foi planejada para seguir o processo de ETL com eficiência, apartir da separação do sistema em microserviços, cada qual com sua responsabilidade dentro do processo de ETL.

2.3 Padrão de Arquitetura REST

O termo foi definido no ano 2000, na tese de doutorado de Roy Fielding e é a sigla para Representational State Transfer: é um design de arquitetura construído para servir aplicações em rede.

Conceitualmente falando, o modelo REST representa nada mais que uma possibilidade para a criação de web services, cujas principais diferenças em relação ao modelo tradicional (SOAP) estão na utilização semântica dos métodos HTTP (GET, POST, PUT e DELETE), na leveza dos pacotes de dados transmitidos na rede e na simplicidade, fazendo desnecessária a criação de camadas intermediárias (Ex.: Envelope SOAP) para encapsular os dados.


Características de uma requisição REST:

  • O método HTTP é utilizado para determinar a operação a ser realizada em um determinado recurso. Em geral, utiliza-se o GET para recuperar, POST para criar, PUT para alterar e DELETE para apagar;
  • O recurso, por sua vez, é indicado na URL da requisição; Parâmetros podem ser passados na própria URL e/ou no corpo na requisição;
  • Os tipos de dados utilizados na requisição e na resposta devem ser acordados entre o servidor e o(s) cliente(s). JSON e XML estão entre os tipos mais utilizados.

REST x RESTful:

Existe uma certa confusão quanto aos termos REST e RESTful. Entretanto, ambos representam os mesmo princípios. A diferença é apenas gramatical. Em outras palavras, sistemas que utilizam os princípios REST são chamados de RESTful.

  • REST: conjunto de princípios de arquitetura
  • RESTful: capacidade de determinado sistema aplicar os princípios de REST.

2.4 Padrão de arquitetura do REACT

  • View: um contêiner responsavel por escutar o estado da aplicação, atualizar e renderizar componentes.

  • Store: é o container que armazena e centraliza o estado geral da aplicação. Ela é imutável, ou seja, nunca se altera, apenas evolui.

  • Actions: são fontes de informações que são enviadas da aplicação para a Store. São disparadas pelas Action Creators, que são simples funções que, ao serem executadas, ativam os Reducers.

  • Dispatcher: recebem e tratam as informações para que sejam (ou não) enviadas à Store.

3. Metas e Restrições da Arquitetura


3.1 Metas

A Arquitetura desse projeto tem como principal objetivo o desacoplamento do sistemas em diferentes microserviços, trazendo máxima independência possível, favorecendo o entendimento sobre o objetivo de cada microserviço, a manutenibilidade e evolução. O sistema deve proporcionar facilidade para os usuários poderem aferir os dados, além de facilitar a análise dos mesmos.

3.2 Restrições da Arquitetura

  • O projeto possui as seguintes restrições:
  • Framework Django 2.1 com Python 3.6
  • API's REST
  • ReactJS

4. Arquitetura dos Serviços e visão de Implementação


4.1 Visão Geral

4.2 Microserviços e camadas

A arquitetura e sua versão atual está particionada em:

  • 1 - Front-End (Analytics)

    Esta fronteira é responsável por resgatar os dados armazenados no DW (CrossData) para geração dos analytics, apresentando para o usuário final.

  • 2 - Cross Data (Data Warehouse)

    Fronteira responsável pela função de DW, depósito onde se é persistido e mantido os dados relevantes para o produto. Através de uma API, disponibiliza os dados para a fronteira de analytics (Front-End).

  • 3 - Importer (Extract, Transform, Load)

    O Importer é a fronteira responsável no processo de ETL, pela extração dos dados das API's externas, tratamento e separação de dados relevantes, e carregamento para o DW (CrossData). Para a alimentação contínua de dados atualizados e com datas diferentes para geração de análises temporais, o Importer funciona como um Worker, fazendo todo o processo periodicamente a automaticamente.

Json de dados que será enviado:


[ { "id_steam": 123, "name": "Test 1", "positive_reviews_steam": 1923123, "negative_reviews_steam": 12121, "owners": 130000, "average_forever": 2127, "average_2weeks": 132, "price": "0", "languages": [ "mandarim", "espanhol" ], "genres": [ "tiro", "porrada" ], "main_image": "google.com", "screenshots": [ { "url": "https://steamcdn-a.akamaihd.net/steam/apps/570/ss_86d675fdc73ba10462abb8f5ece7791c5047072c.600x338.jpg?t=1536248487", "palette": [ { "r": 8, "g": 16, "b": 2, "hex": "#1aa741" }, { "r": 34, "g": 12, "b": 37, "hex": "#2e204d" }, { "r": 22, "g": 48, "b": 34, "hex": "#484454" }, { "r": 121, "g": 80, "b": 254, "hex": "#b5b49a" }, { "r": 19, "g": 26, "b": 21, "hex": "#3b4233" } ] }, ], "release_date": "1 Feb, 1999", "r_average": 83, "g_average": 82, "b_average": 74, "count_videos": 1, "count_views": 2609773, "count_likes": 5555, "count_dislikes": 1107, "count_comments": 4152, "total_views": 46939, "streams": [ { "language": "en", "game_id": "29595", "started_at": "2018-11-03T12:00:06Z", "type": "live", "viewer_count": 23661 }, ] }, ]

APIs Externas: Diferentes fontes de dados acerca de jogos digitais

  • SteamSpy
  • Twitch API
  • Youtube API

4.3 Diagrama de pacotes


  • Acima é demonstrada a implementação geral dos pacotes do Importer service.

    Os arquivos Steam.py, Youtube.py, Twitch.py são responsáveis pela comunicação com as API's e fontes de dados externas. O Importer.py tem como tarefa a centralização dos dados requisitados e tratamento destes.

    No arquivo tasks.py se encontra o celery, que é responsável por fazer um requisição GET no Importer.py e logo após um POST com os dados dos jogos para o CrossData, de forma periódica.


  • Acima é demonstrada a implementação geral dos pacotes do CrossData service.

Dentro de Aplicações Django, os pacotes são representados pelos apps.

    o pacote API é responsável pelo recebimento dos dados mandados através de requisições POST vindos do worker Importer, que então são persistidos no banco de dados. A API também disponibiliza os dados através de endpoints por requisições GET.

5 Visão de dados


5.1 Cross Data

5.2 Dicionário de dados Cross Data

Entidade: Game
Atributo Dominio Descrição Relevância
id int Primary key da tabela Identificar os dados
id_steam int Id na steam Identificar o jogo no banco de dadso da steam
name string Nome do jogo Categorizar os jogos
languages string Linguages do jogo Locais mais jogados
genres Genre Foreign Key de relacionamento NxM com a entidade Genre Categorizar os jogos
release_date date Data de lançamento do jogo Categorizar os jogos, análise temporal
main_image string Imagem representante do jogo Visual
r_average int Média de cor R Análise de paleta de cores
g_average int Média de cor G Análise de paleta de cores
b_average int Média de cor B Análise de paleta de cores


Entidade: InfoYoutube
Atributo Dominio Descrição Relevância
id int Primary key da tabela Identificar os dados do youtube
id_game int Foreing key para a tabela game Relacionar com os dados de game
count_videos int Quantidade de videos relacionados do youtube Controle de dados
count_views int Quantidade de visualizações Popularidade do jogo
count_likes int Quantidade de likes Popularidade do jogo
count_dislikes int Quantidade de disli Popularidade do jogo
date Date Data em que os dados foram obtidos Diff e análises temporais


Entidade: InfoSteam
Atributo Dominio Descrição Relevância
id int Primary key da tabela Identificar os dados da steam
id_game int Foreing key para a tabela game Relacionar com os dados de game
positive_reviews_steam int Valor das avaliações positivas Avaliações positivas para feedback do jogo
negative_reviews_steam int Valor das avaliações negativas Avaliações negativas para feedback do jogo
owners int Média de quantidade de donos daquele jogo Descobrir popularidade
avarage_forever int Media da avaliação do jogo Receber feedback do jogo em um período geral
avarage_2weeks int Media da avaliação do jogo das ultimas duas semanas Receber feedback do jogo em duas semanas
price int Preço do jogo Obter preço
date Date Data em que os dados foram obtidos Diff e análises temporais


Entidade: InfoTwitch
Atributo Dominio Descrição Relevância
id int Primary key da tabela Identificar os dados da Twitch
id_game int Foreing key para a tabela game Relacionar com os dados de game
total_views int Total de visualizações do jogo Popularidade do jogo
date Date Data em que os dados foram obtidos Diff e análises temporais


Entidade: StreamTwich
Atributo Dominio Descrição Relevância
id int Primary key da tabela Identificar os dados da Stream da Twitch
id_game int Foreing key para a tabela game Relacionar com os dados de game
viewer_count int Quantidade de visualizações Popularidade do jogo
type string Tipo de video Categorizar os vídeos
language string Linguagens da stream Locais mais jogados
started_at date Momento que inicia a stream Descobrir período mais jogado
date Date Data em que os dados foram obtidos Diff e análises temporais


Entidade: Genre
Atributo Dominio Descrição Relevância
id int Primary key da tabela Identificar os dados
genre string Nome do gênero Categorizar os jogos


Entidade: Screenshot
Atributo Dominio Descrição Relevância
id int Primary key da tabela Identificar os dados
game Game Foreign Key para relacionar com a entidade Game Identificar a qual jogo pertecendo o screenshot
url string Url para onde a imagem está hospedada Buscar a imagem


Entidade: Pallete
Atributo Dominio Descrição Relevância
id int Primary key da tabela Identificar os dados
image Screenshot Foreign Key para relacionar com a entidade Screenshot Identificar a qual imagem pertence a paleta de cores
r int Quantidade de R na imagem Análise de paleta de cores
g int Quantidade de G na imagem Análise de paleta de cores
b int Quantidade de B na imagem Análise de paleta de cores
hex string Hexadecimal da cor Análise de paleta de cores


  • Dados obtidos das API's externas (Steam, Twitch e Youtube)