- Oye, #nodejs, ¿cómo es que eres tan rápido?
+ Es que yo soy async.
Fuente: pinchito
Motor de JS en Chrome: V8 (en cómic)
Adaptado para el servidor por Ryan Dahl
Software libre (conoce tu software)
Soporte de Joyent
Asíncrono
No bloqueante
Event-driven
Servidores similares:
Ruby: EventMachine
Java: Akka
Fuente: nodejs.org/about, Wikipedia
Un programador tenía un problema.
Pensó para sí mismo,
"Ya sé, ¡lo resolveré con hilos!".
tiene Ahora problemas. dos
Adaptado de: Davidlohr Bueso
Hilos: Apache MTM, Java Servlets
Eventos: nginx, node.js
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
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
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
Crear proyecto node.js
Añadir a GitHub
¡Hola, mundo!
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
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);
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!
Almacenamiento de valores precalculados
Respuesta casi instantánea (~10 µs)
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
get, gets
set, add, replace, append, prepend, cas
delete
incr, decr,
touch
slabs
stats
flush_all, version, quit
Fuente: protocol.txt
Servidor memcached simplificado
get, set, delete
Protocolo simplificado
Sólo acepta cadenas (sin saltos de línea)
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
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
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!
Seguramente no