Giter Club home page Giter Club logo

challenge-bravo's Introduction

HU Desafio Bravo

Construa uma API, que responda JSON, para conversão monetária. Ela deve ter uma moeda de lastro (USD) e fazer conversões entre diferentes moedas com cotações de verdade e atuais.

A API deve converter entre as seguintes moedas:

  • USD
  • BRL
  • EUR
  • BTC
  • ETH

Ex: USD para BRL, USD para BTC, ETH para BRL, etc...

A requisição deve receber como parâmetros: A moeda de origem, o valor a ser convertido e a moeda final.

Ex: ?from=BTC&to=EUR&amount=123.45

Você pode usar qualquer linguagem de programação para o desafio. Abaixo a lista de linguagens que nós aqui do HU temos mais afinidade:

  • JavaScript (NodeJS)
  • Python
  • Go
  • Ruby
  • C++
  • PHP

Você pode usar qualquer framework. Se a sua escolha for por um framework que resulte em boilerplate code, por favor assinale no README qual pedaço de código foi escrito por você. Quanto mais código feito por você, mais conteúdo teremos para avaliar.

Requisitos

  • Forkar esse desafio e criar o seu projeto (ou workspace) usando a sua versão desse repositório, tão logo acabe o desafio, submeta um pull request.
  • O código precisa rodar em macOS ou Ubuntu (preferencialmente como container Docker)
  • Para executar seu código, deve ser preciso apenas rodar os seguintes comandos:
    • git clone $seu-fork
    • cd $seu-fork
    • comando para instalar dependências
    • comando para executar a aplicação
  • A API precisa suportar um volume de 1000 requisições por segundo em um teste de estresse.

Critério de avaliação

  • Organização do código: Separação de módulos, view e model, back-end e front-end
  • Clareza: O README explica de forma resumida qual é o problema e como pode rodar a aplicação?
  • Assertividade: A aplicação está fazendo o que é esperado? Se tem algo faltando, o README explica o porquê?
  • Legibilidade do código (incluindo comentários)
  • Segurança: Existe alguma vulnerabilidade clara?
  • Cobertura de testes (Não esperamos cobertura completa)
  • Histórico de commits (estrutura e qualidade)
  • UX: A interface é de fácil uso e auto-explicativa? A API é intuitiva?
  • Escolhas técnicas: A escolha das bibliotecas, banco de dados, arquitetura, etc, é a melhor escolha para a aplicação?

Dúvidas

Quaisquer dúvidas que você venha a ter, consulte as issues para ver se alguém já não a fez e caso você não ache sua resposta, abra você mesmo uma nova issue!

Boa sorte e boa viagem! ;)

Challange accepted

Resposta ao Desafio Bravo

Foi construída uma API, respondendo em JSON. A api foi feita em java com spring boot, openFeign no netflixOss para integração com a api externa de cotação, spring chache e caffeine para gerenciamento do cache. Como pode ser visto abaixo, para a arquitetura escolhida, é usado um worker que é capaz de buscar cotações atuais com lastro em USD entre diversas moedas e à partir de fontes sendo realizado um cache que é atualizado a cada 60s, podendo ser extendido.

Fontes de cotação on-line

Arquitetura

Architecture

Worker:

  • é realizado um cache da api que retorna as cotações.
  • Resposável por manter as cotações sempre atualizadas.
  • Permite diminuir o tempo de resposta da API já que não necessitará consultar a atualização na internet.

API:

  • A api foi contruída em Java 9 já contenplando os recursos da programação funcional,Lombok para deixar o java menos verboso, spring boot 2, spring cacheble, caffeine para gerenciamento de cache,openFeign netflix oss, mockito e Junit para testes, maven como gerenciador de dependencias e Docker
  • Responde aos requests http de converções dos usuários e processa as requisições entregando o resultado da cotação processada no formato JSON.

EXECUTANDO

TESTES de carga

  • Para os testes de performance utilizei a integração do framework gatling escrevendo os testes em scala, aqui meu projeto que utilizei nos testes https://github.com/fabriciofelipe/gatling-load-performance

  • Atendeu mais de 1000mil requisições por segundo

  • Global Information --------------------------------------------------------

  • request count 20000 (OK=20000 KO=0 )

  • min response time 0 (OK=0 KO=- )

  • max response time 357 (OK=357 KO=- )

  • mean response time 13 (OK=13 KO=- )

  • std deviation 35 (OK=35 KO=- )

  • response time 50th percentile 3 (OK=3 KO=- )

  • response time 75th percentile 7 (OK=7 KO=- )

  • response time 95th percentile 76 (OK=76 KO=- )

  • response time 99th percentile 177 (OK=177 KO=- )

  • mean requests/sec 952.381 (OK=952.381 KO=- )

  • ---- Response Time Distribution ------------------------------------------------

  • t < 800 ms 20000 (100%)

  • 800 ms < t < 1200 ms 0 ( 0%)

  • t > 1200 ms 0 ( 0%)

  • failed 0 ( 0%)

  • ================================================================================

Indicators

ActiveUsers & ResponseTime.

MumberReqPerSec

ResponseTime & NumberReq

backLog

  • Criar uma estrutura de fallback(podemos usar a arquitetura da netflixOSS), para buscar cotação em outras fontes.

challenge-bravo's People

Contributors

fabriciofelipe avatar zanaca avatar rodrigosdo avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.