/api-votacao-cooperativa

API Rest para Votações

Primary LanguageJava

Votação Cooperativa

Este projeto tem o objetivo de registrar e contabilizar os votos dos associados de uma coperativa durante as sessões de pautas abertas em assembleias.

Informações do Projeto

  • Aplicação com Spring-Boot 2 e Java 11.
  • Utiliza lombok, necessário instalar na IDE (utilizado Spring Tool Suite 4). https://projectlombok.org/download
  • Start configurado para porta 8080.
  • Swagger pode ser acessado em http://localhost:8080/swagger-ui.html#
  • Aplicação está configurada em três versões (1.0, 1.1 e 1.2) para exemplificação de versionamento.
  • Necessário ter instalado o Maven.
  • Necessário ter o Docker e Docker-Compose instalado caso deseje subir em container.
  • Necessário alterar configuração do arquivo "application.properties" para indicar um banco Postgres caso deseje não utilizar container.
  • URL do serviço externo de validação de CPF precisa ser informado no arquivo "application.properties" na propertie "url.valida.cpf"
  • Por padrão a propertie "url.valida.cpf" aponta para um endpoint local de teste.

Start da Aplicação

É possível subir aplicação e banco de dados em container docker através do docker-compose seguindo os seguintes passos:

  • Executar o comando do maven "mvn package" para gerar o arquivo jar.
  • Executar o comando "docker-compose -f docker-compose.yml up" também na pasta raiz do projeto.
  • Após inicialização do container, acessar a url http://localhost:8080/swagger-ui.html#

Outra forma é sem container:

  • É preciso alterar o arquivo "application.properties" para indicar um banco de dados Postgres.
  • Executar o comando "mvn spring-boot:run" na pasta raiz da aplicação.
  • Após inicialização acessar a url http://localhost:8080/swagger-ui.html#

Modelo de dados

Entityrelationshipdiagram1

ARQUITETURA IMPLEMENTADA

Arquitetura da implantação local:

Diagrama- Arquitetura-Votacao-Cooperativa-Local

Arquitetura da implantação em nuvem (utilizada aws como exemplo):

Diagrama- Arquitetura-Votacao-Cooperativa-AWS

Nesta arquitetura o processo de registrar um voto está síncrono, realizando a verificação do CPF em API externa e gravando no banco antes de responder a requisição do voto, como ilustrado no diagrama abaixo. Esta implementação não considerou um cenário de grande fluxo de requisições.

ReceverVotoSincrono

ARQUITETURA SUGERIDA

Considerando um cenário de centanas de milhares de requisições, que exige da aplicação um processamento assíncrono, proponho a seguinte arquitetura em nuvem (utilizada aws como exemplo):

Diagrama-Arquitetura-Votacao-Cooperativa-AWS

Nesta arquitetura a implementeção também necessita ser diferente, pois a intensa comunicação com o banco de dados relacional, para consultar e gravar, além da integração com API externa certamente irão onerar o processo. Nessa caso vi a necessidade da utilização de fila, para processar os votos, e cache para realizar as validações ao receber os votos. Sendo assim o processo de registrar um voto foi quebrado em dois fluxos:

  1. Receber uma requisição de voto:

ReceberVoto

Primeiro o voto é recebido, realiza as validações necessárias e produz uma mensagem para a fila de processamento de votos, que então dará início ao segundo fluxo:

  1. Processar registro dos votos:

ProcessarVoto

Neste cenário o processo de contabilizar os votos e dar o resultado da pauta seria executado em um job externo a API com agendamento para a data/hora igual ao encerramento da sessão da pauta. Esse agendamento seria criado no momento de inicialização da sessão da pauta.