Plataforma de software construída para realizar análises de sentimentos, em tempo real, processando mensagens de feeds para calcular métricas de engajamento usando algorítmos determinísticos.
Esse projeto foi desenvolvido utilizando as seguintes ferramentas:
- Go (
go): v1.25.1 ou superior - Docker Engine: v28.0.1 ou superior:
- Comando
dockersem sersudo. Opcional;
- Comando
- Docker Compose: v2.29.7-desktop.1 ou superior;
- GNU Make: v4.3 ou superior.
Em linhas gerais, o projeto é composto de:
webservice: Um servidor de aplicação HTTP, implementado em Go, utilizando uma estrutura idiomática baseada em um padrào de projeto orientado à recursos de API (resource-oriented design). No tocante a essa camada, a aplicação serve um API RESTful com os seguintes recursos:- API utilitária (
/utilitary):- Requisições de healthchecking, de modo a verificar a sanidade do servidor de aplicação;
- API de analise de sentimentos (
/api/v1/sentiment):- Requisições para determinar a análise de sentimento para:
- Um feed com um conjunto de mensagens;
- Uma única mensagem;
- Requisições para determinar a análise de sentimento para:
- API utilitária (
infra: Contem as declarações do manifesto do Docker Compose da imagem Docker do serviçowebservice, além de arquivos subsidiários ao funcionamento do servidor;Makefile: Comandos executados viamake, implementados para facilitar a manipulação da camada de automação do projeto;scripts: Scripts que são consumidos pelos comandos executados viamake;.githubUma camada de infraestrutura como código (IaC). Na pastaworkflows, foram implementadas duas pipelines, executadas automaticamente pelo Github Actions:static-analysis.yml: Realiza a execução de testes unitários, verificação de vulnerabilidades e linting do código-fonte;image-analysis.yml: Realiza a análise de sanidade da imagem Docker do serviçowebservice, de modo a garantir o uso eficiente dos recursos do contêiner, em tempo de execução.
Note
Para gerar ou atualizar o diagrama acima, basta executar na raíz do projeto o comando make topology.
Associado ao manifesto do Docker Compose, o serviço declarado é
| Serviço | Descrição | Portas expostas | URL base externa | URL base interna |
|---|---|---|---|---|
webservice |
Servidor de aplicação (Go) que fornece a API RESTful | 8080 (TCP,HTTP) | http://localhost:8080 |
http://webservice:8080 |
Important
Concernindo as URLs supracitadas, as externas são classificadas assim pois são externas à rede do Docker, e.g. quando a aplicação Fastify está sendo rodada localmente na máquina.
Similarmente, uma URL é dita interna pois é interna à rede do Docker, e.g. quando tanto o app Fastify quanto o servidor PostgreSQL estão rodando em seus contêineres, se comunicando via TCP.
Com base nas especificações do teste técnico, o modelo determinístico para o cálculo de sentimentos de mensagens de feed foi implementado como uma biblioteca, em ./webservices/libs/sentiment, seguindo a estrutura abaixo:
./webservice/libs
├── ... # Demais bibliotecas
├── sentiment
│ ├── analyzer.go # Onde se encontram os métodos principais para cálculo de sentimentos para feed e para uma mensagem isolada
│ ├── anomalies.go # Função auxiliar para detecção de anomalias (várias mensagens dentro de uma janela de 2s), com base em todas as mensagens do feed
│ ├── definitions.go # Declarações de constantes comuns a todos os módulos da lib
│ ├── engagement.go # Funções auxiliares para o cálculo do escore de engajamento e de influência que as mensagens causaram, para todos os usuários no feed
│ ├── helpers.go # Funções auxiliares comuns aos demais módulos da lib, e.g. remoção de acentos e tokenização de mensagens, validaçòes de data/hora
│ ├── models.go # Declarações de tipos de I/O mais complexos, utilizados nas assinaturas de funções
│ └── trending_topics.go # Função auxiliar para a extração das "trending topics" (tópicos com engajamento mais notável) dentre as mensagens do feedImportant
Por questões de restrição de tempo, não foram conduzidos testes exploratórios mais extensos da API e, por extensão, da biblioteca em questão. Entretanto, ambos pode ser considerados funcionais.
Através do make, via scripts de automação do Docker Compose implementados em um Makefile, na raíz do projeto. Para conferir a documentação de cada script, basta executar no terminal
make # Sem nenhum comando, executa o fallback 'help'
make help # Explicitamente, mostra a documentaçãoConsiderando uma instalação inicial, na raíz do projeto, execute os seguintes comandos:
$ make swagger # Gera ou atualiza a pasta `./webservice/docs`, a qual contém
$ make build c=webservice # Realiza a build da imagem Docker, cujo manifesto encontra em `./infra/docker/webservice`
$ make init c=webservice # Inicia o container do serviço `webservice`, em modo detached, e inicia a captura de logsNote
Para se certificar de que as imagens foram geradas pelo processo de build, basta executar o comando docker image ls.
Para se certificar de que os contêineres foram de fato devidamente iniciados e na escuta das portas corretas, basta executar o comando make ps.
Para ver os logs de um conteiner específico, execute make logs c=[nome-do-serviço].
Important
A documentação da API RESTful pode ser acessada pela Swagger UI, via browser, através da URL http://localhost:8080/api/v1/swagger
De modo a conduzir testes exploratórios na API RESTful, foram criados uma collection e um environment do Postman. Ambos se encontram em ./resources/testing
Similarmente, para ambos os ambientes, de modo a encerrar a execução de todos os contêineres, basta rodar:
make stop # Interrompe os contêineres que estiverem sendo executados
make clean # Opcional. Remove os contêineres e a network associadas aos serviços do ambienteEntre em contato com o desenvolvedor do projeto:
