Hoy queremos hablaros de Clouding.io, una plataforma cloud. En este artículo probaremos sus servicios y daremos nuestra opinión sobre ellos.
Para ello no queríamos dejar de enseñaros algo que no hemos visto hasta ahora y que os puede ser de utilidad. Desplegaremos una API REST utilizando Docker y Docker Compose en los servidores de Clouding.io.
Para sacar conclusiones, vamos a hacer pruebas de rendimiento usando JMeter a la API REST que hemos desplegado en sus servidores.
Además daremos nuestra opinión global sobre la experiencia de uso de los sistemas de Clouding.io.
¿Qué es Clouding.io?
Si nunca has oído hablar de Clouding.io, te ponemos al día rápidamente.
Se trata de una empresa española que proporciona servicios en la nube, permitiéndonos levantar servidores privados virtuales (VPS) en su cloud. Si quieres empezar a trabajar o probar clouding.io estás de suerte porque al registrarte te darán un saldo de 5€. Puedes hacerte una idea de lo que te pueden rentar este saldo echando un ojo a su página.
¿En qué consiste la API REST?
Para la prueba que queremos hacer hemos utilizado un proyecto que tenemos en marcha.
Usaremos una aplicación escrita en Node.js utilizando Express como framework para montar la API REST. Esta API ofrece dos endpoints que permiten acceder a los datos de una base de datos de cartas coleccionables.
Utilizamos mongoose como cliente para conectar con la base de datos en MongoDB. También utilizamos lodash para manejar los resultados de las consultas y devolver resultados.
Para desplegar la API usaremos docker, así que hemos tenido que crear un fichero Dockerfile en la raíz del proyecto con el siguiente contenido:
Código
Éste define cómo se creará el contenedor y posteriormente la imagen de docker que albergará nuestra API. Se puede apreciar que utilizamos como imagen base la oficial de node y además que hacemos la instalación de paquetes y ejecución utilizando npm.
Posteriormente tendremos que definir el fichero docker-compose.yaml que se encargará de levantar la API junto con una instancia de MongoDB y permitir que se conecten entre sí.
Código
Cabe destacar que usaremos la imagen oficial de MongoDB y que abriremos el puerto 8888 para la app (API REST) y el 27017 para mongo. También hemos indicado que tras una caída de la API ésta se reinicie.
Con el código de la aplicación web, el Dockerfile y el docker-compose.yaml ya tendremos todo lo necesario para desplegarlo en cualquier máquina que tenga Docker Compose instalado.
Crear un servidor con Docker preinstalado
Antes de nada entra con tu cuenta en Clouding.io. Te aparecerá la siguiente pantalla la cual te permite crear tu primer servidor.

Lo primero que tienes que hacer es escribir el nombre de tu servidor.

Selecciona la imagen o sistema operativo que necesites, en este caso usaremos Ubuntu 18.04 con Docker como aplicación preinstalada.

Ahora tienes que configurar dicho servidor: RAM, vCores (procesador), disco SSD. Además podrás activar backups, una red privada y/o activar SSH. Podéis ver nuestra configuración completa en la siguiente imagen.

Destacar que mientras vais variando las configuraciones podréis ver el coste que os supondrá. Nosotros hemos hecho la prueba con la versión más asequible. Pulsando sobre el botón Enviar procederemos a su creación.

Como nuestra API estará escuchando al puerto 8888, tendremos que definir una nueva regla en el firewall de nuestro servidor que permita las conexiones a través de ese puerto TCP.

Solo queda vincular la norma que acabamos definir con nuestro servidor. Accede al apartado del servidor y desde ahí te dará la opción de vincular un nuevo firewall.

Instalar Docker Compose
Nosotros hemos decido utilizar SSH para conectarnos al servidor que acabamos de crear. A través del terminal haremos la instalación de docker compose.
Pulsando sobre el nombre del servidor creado nos aparecerá una ventana donde podremos ver los datos de acceso al servidor, entre otra información relevante del servidor.

Desde aquí descargaremos la llave SSH y consultaremos el usuario y la contraseña para acceder. Usaremos el siguiente comando desde el terminal del ordenador (nosotros estamos usando Ubuntu).

Utilizamos el parámetro -i poniendo el nombre del fichero que contiene la llave SSH (lmb.pem) y a continuación ponemos el usuario@ip_del_servidor. Nos pedirá la password del usuario para confirmar el acceso.
Si quieres comprobar que ha ido bien la instalación de Docker ejecuta el siguiente comando.

Una vez que ya estamos dentro de la máquina podemos comenzar con la instalación de Docker Compone. Tendrás que ejecutar los siguientes comandos.
Código
Desplegar API REST
Antes de poder desplegar la API tenemos que subir el código al servidor. Para ello usaremos el siguiente comando utilizando el protocolo SCP desde una terminal nueva (fuera de la conexión SSH).

Una vez subido al servidor solamente tendremos que descomprimirlo para poder empezar con el despliegue.

En el siguiente comando utilizamos el & al final de éste para poder seguir trabajando en la misma terminal una vez están levantados los contenedores.

Llegados a este punto la API y la base de datos estarán desplegadas. Cabe destacar que tuvimos un pequeño problema a la hora de dimensionar el espacio de disco, dimos solo 5GB cuando Ubuntu ocupa casi todo el espacio. Para solucionarlo accedimos al panel del servidor y pulsamos sobre el botón redimensionar. Añadimos 10GB de espacio para solucionar el problema.

Prueba funcional
Teniendo ya todo desplegado, hemos hecho una prueba para comprobar que la API contesta correctamente a las peticiones que le hacemos. Para ello hemos utilizado Postman, una herramienta que hemos comentado en otros artículos.
Introducimos para hacer la petición la IP de nuestro servidor, el puerto donde está desplegada la API y una URI de la misma.

Prueba de rendimiento
Para las pruebas de rendimiento hemos decidido utilizar el software de código abierto JMeter. Con esta herramienta lanzaremos un elevado volumen de peticiones durante un periodo de tiempo, con el fin de sacar conclusiones sobre el rendimiento del sistema.
Para empezar hemos lanzado una carga reducida, definiendo 90 ciclos para simular 10 usuarios (hilos) con lapsos de tiempo entre cada grupo de 1 segundo. Esta carga la hemos hecho para cuatro URIs distintas. En total han sido 3600 peticiones a la API.
Podemos ver los resultados a continuación y la gráfica con tiempos de respuesta y errores.
Samples | Average | Error % | Throughput | |
HTTP Request | 3600 | 60 | 0.00% | 159.1/sec |

En general se aprecian tiempos de respuesta bajos con una media de 60 ms y ningún error de conexión con la API.
Por otro lado, hemos lanzado una carga elevada al sistema para ver cómo se comporta. Se han definido 90 ciclos para simular un total de 300 usuarios con lapsos de tiempo entre cada grupo de 1 segundo. Esta carga la hemos hecho para cuatro URIs distintas. En total han sido 108.000 peticiones a la API.
Los datos que hemos obtenido son los siguientes:
Samples | Average | Error % | Throughput | |
HTTP Request | 108000 | 1871 | 0.03% | 155.4/sec |
Podemos ver los resultados a continuación y la gráfica con tiempos de respuesta y errores.

Aquí podemos apreciar que la tasa de error ha subido, pero sigue siendo despreciable, tan solo un 0,03% de las request han dado error. Además en comparación con los tiempos de respuesta de la API sometida a una carga baja, vemos que aumentan considerablemente.
Conclusión
Como siempre, esperamos que os sea de utilidad y os haya gustado. Si tenéis cualquier duda podéis contactar con nosotros. A continuación os dejamos nuestra opinión sobre el funcionamiento de Clouding.io para el despliegue y uso de una API REST.
Rendimiento
En las pruebas de carga hemos visto un aumento considerable en los tiempos de respuesta cuando sometemos al servidor a carga elevada. Esto es normal y a pesar del incremento consideramos que son unos tiempos de respuesta más que razonables dada la carga. Una vez hemos añadido más vCores, los tiempos de respuesta obtenidos han sido muy inferiores.
Cabe destacar que pese a la carga que hemos introducido, el servidor no se ha reiniciado ni una sola vez.
Uso del sistema
Un punto positivo que sin duda nos ha gustado es la posibilidad de configurar los recursos del servidor a medida. Puedes elegir el procesador, memoria y espacio en disco para tus máquinas según lo necesites, facturando por horas y sin mínimo mensual, pudiendo cambiar los recursos cuando tú quieras.
Nos ha llamado la atención para bien, encontrar soporte telefónico y vía correo electrónico para atender nuestras dudas. Además hemos visto que existe una Base del Conocimiento, un blog y un apartado de preguntas y respuestas (estilo StackOverflow) que resultan especialmente útiles para resolver problemas. Quizá nos hubiera gustado encontrar todos estos apartados dentro del “área de cliente”, donde configuras tus servidores.
Además hemos encontrado muy útil la herramienta para redimensionamiento del servidor, si en algún momento creemos que es necesario cambiar la configuración puede hacerse sin problemas. Solo será necesario un reinicio y en apenas dos minutos estará listo.
También nos ha gustado la característica del archivado. Si archivamos el servidor durante el tiempo que no lo estemos utilizando, sólo pagamos uno de los tres recursos: el disco ssd, con lo que podemos ahorrar.