Especificação
Documento de Arquitetura
Sumário
-
1 . Introdução
- 1.1. Finalidade
- 1.2. Escopo
- 1.3. Definições, acrônimos e abreviações
- 1.4. Referências
- 1.5. Visão Geral
-
4 . Arquitetura dos Serviços e visão de Implementação
- 4.1. Visão Geral
- 4.2. Microserviços e Camadas
- 4.3. Diagrama de pacotes
-
5 . Visão de Dados
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
-
Silva Gomes da Gama e Abreu, Fábio. DESMISTIFICANDO O CONCEITO DE ETL
http://www.fsma.edu.br/si/Artigos/V2_Artigo1.pdf - Vassiliadis, Panos; Simitsis, Alkis. EXTRACTION, TRANSFORMATION, AND LOADING http://www.cs.uoi.gr/~pvassil/downloads/ETL/SHORT_DESCR/08SpringerEncyclopedia_draft.pdf
-
Newman, Sam. Building Microservices.
https://www.nginx.com/wp-content/uploads/2015/01/Building_Microservices_Nginx.pdf
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)