Skip to content

bgiulianetti/challenge-meli-api-mutantes

Repository files navigation

API Mutantes

Descripción

Se realizó el desarrollo de una API Rest en Golang utilizando Gorilla/MUX, la cual expone los siguientes endpoints:

  • Mutant: Detecta si un individuo es mutante o humano al analizar su ADN. El ADN debe ser un array de strings: debe contener 6 items, y cada item debe poseer 6 caracteres. Si el individuo es humano, devuelve un error 403 Forbidden. Si el individuo es mutante, devuelve un 200 Ok.

    Request:

   POST /mutant
   Body:
   { "dna": ["ATGCGA","CAGTGC","TTATGT","AGAAGG","CCCCTA","TCACTG"] }

Response:

   200 Ok (Es mutante)
   403 Forbidden (Es humano)
   400 Bad Request (El payload enviado no cumple con el formato correcto)
   
  • Stats: Devuelve la cantidad de humanos, la cantidad de mutantes validados y, además, devuelve la proporción entre ellos.

    Request:

   GET /stats

Response:

   200 Ok
   Body:
   {
    "count_mutant_dna": 4,
    "count_human_dna": 3,
    "ratio": 1.333
   }
   

Dev

Para poder correr la API de forma local, se requiere tener instalado:

  • Go (requirements: https://golang.org/doc/install)
  • AWS CLI instalada y configurada
  • AWS SDK for GO (instalar mediante el comando: go get github.com/aws/aws-sdk-go)
  • Gorilla MUX (instalar mediante el comando: go get -u github.com/gorilla/mux)

Para poder correr el proyecto, se debe parar a raíz del proyecto y ejecutar el comando:

go run application.go

Por defecto, el proyecto corre en el puerto :5000. Si este puerto está ocupado o no se puede correr la API en él por alguna restricción de su entorno de trabajo, se puede modificar desde el archivo application.go que se encuentra a raíz en la línea 13.

server := http.ListenAndServe(":5000", router) // Cambiar por el puerto de preferencia

Test

  • Todos los tests se encuentran a nivel de cada package
  • Para correr los tests dentro de cada package, ejecutar el comando:
go test

Arquitectura

  • Se decidió utilizar Amazon AWS como servicio Cloud.
  • Se publicó el servicio de API en ElasticBeanstalk, ya que provee un ambiente seteado para poder correr golang, lo que permitió que me concentrara en la infraestructura. Se creó con un auto scaling de 1 a 4 instancias y con un elastic load balancer para distribuir la carga. Todas las instancias corren en la región de San Pablo, la cual es la mas cercana y, por lo tanto, produce menor latencia.
  • Para la persistencia, se decidió utilizar DynamoDB, un servicio de base de datos NoSQL de AWS. Con este servicio, se pueden realizar peticiones de escritura y lectura de alta demanda. Se configuró un auto scaling para que responda bajo demanda. Con cada adn nuevo guardado se acola un mensaje nuevo en DynamoDB Streams y un consumidor (Lambda Function) obtiene uno a uno los mensajes y guarda la cuenta de humanos y mutantes en una tabla aparte en DynamoDB. En caso de que algún error pueda ocurrir, y no se pueda persistir el adn validado, este se guarda en un log en un bucket en S3 para su posterior estudio y eventual correcto guardado, de esta manera garantizamos que no se produzca perdida de información en el caso de que falle la persistencia a DynamoDB. logo

Endpoints

/mutant

http://apimutantes-env.mmizwaripz.sa-east-1.elasticbeanstalk.com/mutant

/stats

http://apimutantes-env.mmizwaripz.sa-east-1.elasticbeanstalk.com/stats

About

API written in Go with Gorilla/MUX

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages