Para executar:
git clone https://github.com/dancastellani/bbb-paredao cd bbb-paredao ./configure make
Após rodar, acesse:
- Para realizar a votação: http://localhost:9090/
- Para ver o Resumo dos votos: http://localhost:9090/resumo.xhtml
Cliente: HTML + CSS + Javascript + JSF (resumo apenas)
Servidor:
- Java
- Maven
- Jetty ou Tomcat6
- JDBC
- Flyway
- Quartz
Testes:
- TestNG + Mockito
Banco de Dados:
- HSQL ou Postgres
-
Votação muito acessada. Busquei fazer a parte de votação o mais leve possível, pois essa parte deverá ter muitos acessos. Assim, ela foi feita usando um servlet que é consumido por javascript (Jquery) pelo cliente. Fiz essa parte assim, sem JSF para que o ciclo JSF que é pesado não seja executado, nem sejam armazenados em memória dados sobre a requisição do cliente.
-
Resumo da votação Para o resumo da votação eu usei JSF, já que essa parte é usada apenas por uma equipe interna.
-
Para bloquear o acesso a máquinas, que imagino que a preocupação seja de DoS ou votação automática, usei como Throttle o DoSFilter do Jetty, que pode ser configurado com o número de acessos por máquina, tempo, etc. Esse filtro utiliza o IP do cliente para verificar a quantidade de acessos. Por padrão estou considerando 30 chamadas por segundo por cliente antes de ser aplicado o Throttle. Para garantir que apenas humanos usem, poderia ser utilizado captcha.
-
A aplicação segue MVC, Service Layer e DAO,
-
O Banco de dados padrão está sendo HSQL em memória para facilitar a utilização tendo menos dependências para a instalação. Mas a aplicação está pronta para usar Postgres também. Para isso, devem ser feitas alterações em algumas queries: (1) uma query votos por hora que utiliza uma função de data do HSQL que não é presente no postgres; (2) nas migrações também são utilizadas funções de data que não são compatíveis entre HSQL e Postgres. Em ambos os casos adaptações poderiam ser feitas para a aplicação ter migrações e executar consultas cross-configuração.
-
O Maven gerencia todo o ciclo de construção e execução (com Jetty). Foram criados perfis de desenvolvimento e produção.
-
Não foi utilizado framework para acesso ao banco de dados e controle transacional. O acesso ao Banco foi feito utilizando JDBC apenas. Não foi utilzado hibernate ou outro ORM pois não valeria a pena para uma aplicação deste tamanho com poucas entidades que a principal funcionalidade é a votação e teria que ser otimizada, provavelmente, executando as consultas como queries sem ORM. Essa parte poderia ser melhorada usando o Framework Spring para fazer as consultas.
-
Para a Migração da base de dados e alimentação dos dados de teste e dados fake para inicializar a aplicação foi utilizado o Flyway.
-
Os votos são armazenados em memória quando são realizados e são salvos no banco de dados em batch periodicamente. Foi feito dessa forma para deixar mais leve a votação. Os votos são salvos a cada segundo, mas este tempo é configurável. Para implementar esta tarefa foi utilizado o Quartz.
-
Para os testes foi utilizado o TestNG + Mockito.
-
O deploy pode ser feito em Tomcat 6 ou Jetty.
-
Foi realizado teste de carga com ab da Apache no Ubuntu, obtendo mais de 1000 acessos por segundo em ambas as páginas e web services.
-
Para aumentar ainda mais a disponibilidade, poderiam ser utilizados vários servidores com um balancer na frente dividindo as requisições entre eles. Para facilitar o deploy e teste, foi utilizado o Jetty Embed no Maven. Mas em ambiente de produção outro servidor deveria ser utilizado, configurado para isso.