/ HOWTO

Probando NodeJs 9.2.


Hoy nos toca probar NodeJs 9.2, con una aplicación que tenemos corriendo en PRO.

Aunque creemos que “seguramente” funcione, debemos estar seguros que no hay problemas colaterales o comandos depreciados o bugs.

Tenemos un APP crítico y que maneja dinero, un BOT para hacer trading con Bitcoins, lleva varios años corriendo y ahora pensamos en que corra en un Contenedor con la última versión de NodeJs.

Si, debería funcionar, siempre decimos que usando los comandos “normales” y sin hacer “cosas raras” todo es mas fácil. (KIS.S. para ser exactos)

Pero como el APP maneja dinero, no es para correr riezgos.


NodeJs 9.2 corriendo en Docker.

Preparamos un Dockerfile para preparar nuestra imágen local de NodeJs.

# vi Dockerfile
FROM node:9.2
EXPOSE 8080
# docker build -t mynode .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM node:9.2
 ---> c1d02ac1d9b4
Step 2/2 : EXPOSE 8080
 ---> Running in 4630b282fd55
 ---> 64995a48fa2b
Removing intermediate container 4630b282fd55
Successfully built 64995a48fa2b
Successfully tagged mynode:latest

Para correr NodeJs hay varias versiones de O.S. , nosotros preferimos usar una con varios componentes instalados basada en Debian.

Existen otras, una con Alpine mas pequeña pero que es demasiado recortada para lo que queremos instalar luego. En nuestro caso la imágen es de 676 megas.

# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
mynode                         latest              64995a48fa2b        13 minutes ago      676MB

Ahora creamos nuestra APP demo en NodeJs para probar performance de la versión 9.2.

NodeJs tiene un ejemplo de “Web” simple, en nuestro caso atenderá en el puerto 8080.

# vi server.js
var sys = require('sys'),
http = require('http');

http.createServer(function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('<p>Aqui Probando</p>');
  res.end();
}).listen(8080);

Arrancamos un Contenedor con esa versión y ponemos en marcha nuestro servidor NodeJs.

# docker run -it --rm --name nodetest -v "$PWD":/usr/src/app -w /usr/src/app node:9.2 node server.js
(node:1) [DEP0025] DeprecationWarning: sys is deprecated. Use util instead.

En nuestro equipo real, podemos pedir mediante un browser (Mozilla Firefox) la páguna:

http://172.17.0.2:8080/

Descargamos “Apache-Tools” en nuestro Linux para realizar pruebas de stress.

==> Tidying install...
  -> Removing libtool files...
  -> Purging unwanted files...
  -> Removing static library files...
  -> Stripping unneeded symbols from binaries and libraries...
  -> Compressing man and info pages...
==> Checking for packaging issue...
==> Creating package "apache-tools"...
  -> Generating .PKGINFO file...
  -> Generating .BUILDINFO file...
  -> Generating .MTREE file...
  -> Compressing package...
==> Leaving fakeroot environment.
==> Finished making: apache-tools 2.4.29-1 (sáb nov 25 18:41:22 CET 2017)
==> Cleaning up...

Resolving dependencies...
Checking inter-conflicts...
Checking keyring...
Checking integrity...
Loading packages files...
Checking file conflicts...
Checking available disk space...
Installing apache-tools (2.4.29-1)...
Running post-transaction hooks...
Arming ConditionNeedsUpdate...
Transaction successfully finished.

Finalmente llegamos al “Apache Benchmark” donde pedimos contenido. La página (Hola Mundo) que estamos usando para probar no es el mejor ejemplo, pueden cambiar ese contenido estático por un contenido dinámico mas realista.

# ab -kc 20 -t 60 http://172.17.0.2:8080/index.html
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.17.0.2 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests


Server Software:
Server Hostname:        172.17.0.2
Server Port:            8080

Document Path:          /index.html
Document Length:        20 bytes

Concurrency Level:      20
Time taken for tests:   3.728 seconds
Complete requests:      50000
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      6000000 bytes
HTML transferred:       1000000 bytes
Requests per second:    13411.77 [#/sec] (mean)
Time per request:       1.491 [ms] (mean)
Time per request:       0.075 [ms] (mean, across all concurrent requests)
Transfer rate:          1571.69 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       2
Processing:     0    1   0.7      1      16
Waiting:        0    1   0.7      1      16
Total:          1    1   0.7      1      17

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      2
  95%      3
  98%      4
  99%      4
 100%     17 (longest request)


El próximo paso es montar nuestra aplicación real, acceder desde fuera y realizar un “stress test” mas profundo, midiendo los límites que soportará, recordemos que esos límites estarán definidos por nuestro equipo real y la cantidad de Contenedores corriendo que tengamos.


Subscríbete y recibirás los últimos artículos semanalmente en tu email.