Curso de
Día 1: Introducción
Vuestro anfitrión
(según mi hija de 5 años)
Más de 15 años de experiencia en desarrollo
Ingeniero senior en MediaSmart Mobile
Co-organizador de Node.js Madrid
Cacharreador impenitente
@pinchito
Guión
- Primeros pasos
- Sesión práctica 1: hola mundo.
- Simplecached: Memcached en Node.js
- Sesión práctica 2: simplecached.
Node.js
IntroduCCión
Pero primero, un chiste
- Oye, #nodejs, ¿cómo es que eres tan rápido?
+ Es que yo soy async.
Fuente: pinchito
JavaScript en el servidor
Motor de JS en Chrome: V8 (en cómic)
Adaptado para el servidor por Ryan Dahl
Software libre (conoce tu software)
Soporte de Joyent
Modelo de ejecución
Asíncrono
No bloqueante
Event-driven
Servidores similares:
Ruby: EventMachine
Java: Akka
Fuente: nodejs.org/about, Wikipedia
¿Eventos? ¿Por qué no hilos?
Un programador tenía un problema.
Pensó para sí mismo,
"Ya sé, ¡lo resolveré con hilos!".
tiene Ahora problemas. dos
Adaptado de: Davidlohr Bueso
Tres generaciones
Hilos: Apache MTM, Java Servlets
Eventos: nginx, node.js
Node.js es rápido
Pero, ¿es de verdad rápido?
No con código secuencial...
pero sí en ejecución concurrente
Sólo tiene un hilo de ejecución (básicamente sin hilos)
Multi-proceso usando el módulo cluster
Node.js es muy escalable
Node.js es muy lineal
Historia de éxito: PayPal
Página de vista de cuentas
2 ingenieros durante 4 meses
Desarrollado dos veces más rápido que la versión Java
33% menos código, 40% menos ficheros
Soporta el doble de peticiones por segundo
Tiempo de respuesta un 35% más rápido
Fuente: Node.js at PayPal
Historia de éxito: MediaSmart Mobile
Plataforma inicial: un ingeniero durante un año
Plataforma actual: tres ingenieros durante año y medio
Sirve anuncios para campañas en móvil
Soporta 80k peticiones/segundo (al menos)
Escala a 40 servidores (que sepamos)
Latencia < 80 ms
Fuente: datos internos
Sesión práctica 1
Crear proyecto node.js
Añadir a GitHub
¡Hola, mundo!
Especificación técnica
Servidor de sockets, puerto 1702
Al abrir una conexión, pregunta: "¿Hola?"
Al recibir "hola" responde "mundo" y termina
Cualquier otro mensaje resulta en "ERROR"
Nota técnica: ¡cuidado con los retornos de carro!
Siempre deben ser "\r\n".
Documentación: node.js net module
Código de muestra
var net = require('net');
var server = net.createServer(function(connection) {
console.log('Conexión abierta');
connection.write('¿Hola?');
connection.on('data', function(data) {
if (String(data).trim() != 'hola') {
connection.write('ERROR');
} else {
connection.write('mundo');
console.log('Conexión cerrada');
}
});
});
server.listen(port);
Tiene tres errores
Fuente: hello-world.js
¡Bien!
Memcached
La base de datos clave-valor en memoria
¿Qué es Memcached?
Creada en 2003 por Brad Fitzpatrick para LiveJournal
NoSQL antes de que NoSQL fuera cool
Clave-valor
Almacenamiento en memoria (sin persistencia)
Y por supuesto, ¡software libre!
Cacheo por capas
Almacenamiento de valores precalculados
Respuesta casi instantánea (~10 µs)
Uno de los dos grandes inventos en arquitecturas horizontales
(el otro es el gestor de colas)
API básico Memcached
set [key] [flags] [exptime] [bytes]\r\n
[data block]\r\n
\=> STORED
\=> NOT_STORED
almacena un valor en memoria
get [key]* \r\nextrae uno o más valores por clave
\=> VALUE [key] [flags] [bytes]\r\n
[data block]\r\n
END\r\n
delete [key]borra un valor de memoria
\=> DELETED
\=> NOT_FOUND
Fuente: protocol.txt
API Completo
get, gets
set, add, replace, append, prepend, cas
delete
incr, decr,
touch
slabs
stats
flush_all, version, quit
Fuente: protocol.txt
Sesión de prácticas 2: Simplecached
Servidor memcached simplificado
get, set, delete
Protocolo simplificado
Sólo acepta cadenas (sin saltos de línea)
ESpecificación técnica
Servidor tipo memcached en el puerto 11311
set [key] [value]\r\n
\=> STORED
\=> NOT_STORED
almacena un valor en memoria
get [key]\r\nextrae un valor por clave
\=> VALUE [key] [value]\r\n
\=> END\r\n
delete [key]\r\nborra un valor de memoria
\=> DELETED
\=> NOT_FOUND
Pistas
string.trim()
: elimina espacios en los extremos
string.split(separator)
: divide una cadena en un array de trozos
array.slice(begin)
: devuelve una subcadena desde begin
array.join(separator)
: une un array en una cadena
Un objeto JavaScript is an mapa asociativo por clave
El valor puede contener espacios (la clave no)
Cuidado con los casos de error
Vuelta extra: Comando Quit
Añade un comando quit:
quit\r\n
cierra el cliente
Pista: connection.end()
: cierra la conexión
¡Verifica que tu software sea fácil de modificar!
¡Bien!
Seguramente no
Thanks!
Curso de Node.js Amaris: Introducción
By Alex Fernández
Curso de Node.js Amaris: Introducción
Curso para Amaris de Node.js, 2014-11-03: Introducción
- 2,450