Nell'eccellente libro Node.js nel modo giusto l'autore mostra questo esempio:
const
fs = require('fs'),
zmq = require('zmq'),
// socket to reply to client requests
responder = zmq.socket('rep');
// handle incoming requests
responder.on('message', function(data) {
// parse incoming message
let request = JSON.parse(data);
console.log('Received request to get: ' + request.path);
// read file and reply with content
fs.readFile(request.path, function(err, content) {
console.log('Sending response content');
responder.send(JSON.stringify({
content: content.toString(),
timestamp: Date.now(),
pid: process.pid
}));
});
});
e poi dice:
There is a catch to using ØMQ REP/REQ socket pairs with Node. Each endpoint of the application operates on only one request or one response at a time. There is no parallelism.
Quindi usa il modulo cluster nodejs per correggere il problema di ridimensionamento.
Sono rimasto sorpreso dal fatto che l'intero concetto di nodejs
e il libro sono nio
e asyncrhonisity
quindi ero più come se mi aspettassi questa soluzione:
- La richiesta arriva e gestita da zmq.
-
fs
lo gestisce in modo asincrono. - Altre richieste arrivano e vengono gestite da zmq.
- Tutti sono indirizzati a
fs
asincronoreadFile
nio. - Una volta che c'è un callback da
fs.readFile
zmqresponder
viene avviato per ogni nio che completa.
in questo modo con un singolo ciclo di eventi e un singolo thread per le richieste a zmq possiamo servire più richieste. Perché non è così? Dobbiamo aprire più thread per aumentare la scala? Perché non può nio
e asincronautilità aiutare con il nostro singolo thread?