Drupal Day 2011 - Node.js e Drupal

28
Node.js e Drupal Luca Lusso - Wellnet martedì 6 dicembre 11

description

Talk di Luca Lusso | Drupal Day Roma 2011 Snellire il carico del server per generare e restituire un json da usare per un autocompletamento. Notificare che un nodo è stato appena creato a tutti gli utenti che stanno visitando il sito in questo momento. Oppure ancora mettere a disposizione degli utenti una chat in tempo reale. Tutto questo (e molto altro) si può delegare ad un processo esterno a Drupal per aumentare velocità di interazione e diminuire il carico del server. Durante il talk si vedrà come installare e usare node.js e come integrarlo con Drupal. Verrà mostrato il modulo nodejs presente nel repository di drupal.org

Transcript of Drupal Day 2011 - Node.js e Drupal

Page 1: Drupal Day 2011 - Node.js e Drupal

Node.js e Drupal

Luca Lusso - Wellnet

martedì 6 dicembre 11

Page 2: Drupal Day 2011 - Node.js e Drupal

Cos’è e come funziona node.js

• Javascript sul server

• Basato su V8 di Google (il motore javascript di Chrome, open-source)

• Event driven

• I/O asincrono (mediante librerie esterne)

martedì 6 dicembre 11

Page 3: Drupal Day 2011 - Node.js e Drupal

Cos’è e come funziona node.js

• Un singolo processo gestisce il main event loop e tutte le connessioni (singolo thread)

• I task sono eseguiti in modo asincrono lasciando il main event loop libero di gestire altre richieste

• Anche nginx usa lo stesso modello semplicemente perché per una concorrenza massiva non possiamo usare un thread del sistema operativo per ogni connessione, è troppo pesante

martedì 6 dicembre 11

Page 4: Drupal Day 2011 - Node.js e Drupal

Cos’è e come funziona node.js

node

processo di I/O (lento) es.: attesa dati da un

webserviceprocesso di I/O (veloce)es.: query a Mongodb

B

C

A

Tempo

martedì 6 dicembre 11

Page 5: Drupal Day 2011 - Node.js e Drupal

Node.js può essere usato (e da il suo meglio) per

• Gestire la concorrenza

• I/O asincrono

• Networking

• Caricamento asincrono di componenti di una pagina via Ajax

martedì 6 dicembre 11

Page 6: Drupal Day 2011 - Node.js e Drupal

Node.js è sconsigliato per

• Generare intere pagine web

• Restituire grosse quantità di dati (download di file) -> ha un thread solo

martedì 6 dicembre 11

Page 7: Drupal Day 2011 - Node.js e Drupal

Dove si usa?

• Applicazione mobile di Linkedin

• Cloud9 (IDE su web)

• Nodejitsu (Cloud per applicazioni in node.js)

martedì 6 dicembre 11

Page 8: Drupal Day 2011 - Node.js e Drupal

Installare node.js

• http://nodejs.org/

• Ultima versione stabile (0.6.3) disponibile per tutti i sistemi operativi

• github.com/joyent/node/wiki/Installation

• Per Mac Os X e Windows è disponibile l’installer, per Linux basta scaricare il sorgente e compilare :-)

martedì 6 dicembre 11

Page 9: Drupal Day 2011 - Node.js e Drupal

Installare node.js

• NPM (Node Package Manager)

• Gestisce il download e l’installazione delle librerie aggiuntive

• http://npmjs.org/

• Su Linux, Mac Os X: curl http://npmjs.org/install.sh | sudo sh (su Windows è un po’ più complesso)

• Attualmente sono disponibili più di 5000 librerie per i più svariati casi d’uso

• #> npm install express

martedì 6 dicembre 11

Page 10: Drupal Day 2011 - Node.js e Drupal

Hello world (hello.js)

var http = require('http'); http.createServer(function (request, response) { console.log('Request received’);

response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n');}).listen(8000); console.log('Server running at http://127.0.0.1:8000/');

martedì 6 dicembre 11

Page 11: Drupal Day 2011 - Node.js e Drupal

Hello world (hello.js)

funkymac2:Desktop lussoluca$ node hello.js Server running at http://127.0.0.1:8000/Request received

martedì 6 dicembre 11

Page 12: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

• Chiama Ajax per autocompletare i tags durante la digitazione

• Necessita un bootstrap completo di Drupal per gestire la richiesta

• /taxonomy/autocomplete/field_tags/a

martedì 6 dicembre 11

Page 13: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

• express (http://expressjs.com)

• web framework per Node.js

• Nel nostro esempio usiamo solo il routing, ma fa anche middleware, template e altro

• mysql (github.com/felixge/node-mysql)

• driver MySQL per node.js

martedì 6 dicembre 11

Page 14: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

var Client = require('mysql').Client;var client = new Client(); client.user = 'root';client.password = 'root';client.port = 3306;client.database = 'drupaldb';

martedì 6 dicembre 11

Page 15: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

var app = require('express').createServer();

app.get('/autocomplete/:vid/:id', function(req, res) {

martedì 6 dicembre 11

Page 16: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

var query = client.query('SELECT * FROM [...]', [vid, arg, tags.join(',')], function selectCb(err, results, fields) { if (err) { throw err; }

var names = {}; var prefix = (tags.length > 0) ? tags.join(',') + ', ' : ''; for (var i in results) { var result = results[i]; names[prefix + result.name] = result.name; }

res.write(JSON.stringify(names)); res.end(); // end the request. });

Callback! Node.js non si ferma ad aspettare i risultati dal db, li invierà al client quando

saranno pronti!

martedì 6 dicembre 11

Page 17: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

app.listen(3000);

martedì 6 dicembre 11

Page 18: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

martedì 6 dicembre 11

Page 19: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

$form['name_nodejs'] = array( '#type' => 'textfield', '#title' => t('Tags Node.js version'), '#autocomplete_path' => '/autocomplete/1', '#size' => '100', '#maxlength' => '100', );

$form['name_drupal'] = array( '#type' => 'textfield', '#title' => t('Tags drupal version'), '#autocomplete_path' => 'taxonomy/autocomplete/field_tags', '#size' => '100', '#maxlength' => '100', );

martedì 6 dicembre 11

Page 20: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

• /autocomplete/1/% non è un path Drupal

• Necessario per bypassare il problema del cross domain scripting

• Bisogna configurare il mod_proxy di Apache (cosa simile per nginx)

martedì 6 dicembre 11

Page 21: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

<VirtualHost *:80> [...]

ProxyRequests Off

<Proxy *> Order deny,allow Allow from all </Proxy>

ProxyPass /autocomplete http://www.example.it:3000/autocomplete ProxyPassReverse /autocomplete http://www.example.it:3000/autocomplete</VirtualHost>

Nella configurazione del VirtualHost diciamo ad Apache di girare le richieste

alla url “autocomplete” al server node.js in ascolto sulla porta 3000

martedì 6 dicembre 11

Page 22: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

Node.js: 15ms Chiamata standard Drupal: 131ms

Esempio di vocabolario con 3000 termini

martedì 6 dicembre 11

Page 23: Drupal Day 2011 - Node.js e Drupal

Code session: realizzazione di un modulo per l’autocompletamento dei tags

• Possibili migliorie (però con implementazione più complessa)

• Mongodb per memorizzare i termini

• Socket.io per ovviare al problema del cross domain scripting

martedì 6 dicembre 11

Page 24: Drupal Day 2011 - Node.js e Drupal

drupal.org/project/nodejs

• Ancora in versione beta (ma sviluppato attivamente)

• Canali multipli per inviare messaggi asincroni a tutti i client connessi al sito a seconda dei ruoli/permessi

• Basato su Socket.io, express e connect

• Composto da uno script node.js e da un insieme di moduli Drupal

• nodejs_notify -> notifiche growl like

• nodejs_subscribe -> notifica cambiamenti nei contenuti

• nodejs_actions -> action per inviare messaggi, usabile anche da Rules

martedì 6 dicembre 11

Page 25: Drupal Day 2011 - Node.js e Drupal

drupal.org/project/nodejs

client

node

DrupalRichiesta iniziale

Risposta con token di autenticazione

Invio tokenVerifica autenticazione

Lista canali

Autenticazione riuscita

Le chiamate successive non passano più da Drupal

martedì 6 dicembre 11

Page 26: Drupal Day 2011 - Node.js e Drupal

Domande ?!(se non basta il tempo o volete vedere una demo ci

vediamo al desk Wellnet)

martedì 6 dicembre 11

Page 27: Drupal Day 2011 - Node.js e Drupal

Luca Lusso

www.wellnet.it

it.linkedin.com/pub/luca-lusso/29/3a9/1a2

martedì 6 dicembre 11

Page 28: Drupal Day 2011 - Node.js e Drupal

martedì 6 dicembre 11