Scalabilità con zeromq REQ e nodejs

1

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:

  1. La richiesta arriva e gestita da zmq.
  2. fs lo gestisce in modo asincrono.
  3. Altre richieste arrivano e vengono gestite da zmq.
  4. Tutti sono indirizzati a fs asincrono readFile nio.
  5. Una volta che c'è un callback da fs.readFile zmq responder 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?

    
posta Jas 07.05.2016 - 08:40
fonte

1 risposta

2

Questo non ha molto a che fare con Node.js ma più con il funzionamento di zmq.

Se leggi il paragrafo su ZMQ_REQ c'è questa parte:

This socket type allows only an alternating sequence of zmq_send(request) and subsequent zmq_recv(reply) calls.

Quindi un lavoratore che riceve una richiesta può solo ricevere un'altra richiesta una volta che la prima richiesta ha ottenuto una risposta. Questo fa parte delle specifiche zmq.

Se vuoi gestire più richieste allo stesso tempo, puoi creare più risponditori chiama solo zmq.socket('rep'); più volte.

    
risposta data 07.05.2016 - 12:46
fonte

Leggi altre domande sui tag