sql >> Databáze >  >> NoSQL >> Redis

Jak mohu používat clustery Node.js se svou jednoduchou aplikací Express?

Ve skutečnosti vaše pracovní zatížení není ve skutečnosti vázáno na I/O:je vázáno na CPU kvůli nákladům na generování dynamických stránek na bázi nefritu. Nedokážu odhadnout složitost vaší nefritové šablony, ale i s jednoduchými šablonami je generování HTML stránek drahé.

Pro své testy jsem použil tuto šablonu:

html(lang="en")
  head
    title Example
  body
    h1 Jade - node template engine
    #container
      ul#users
        each user in items
          li User:#{user}

Přidal jsem 100 fiktivních řetězců do klíče položek v Redis.

Na mém boxu dostanu 475 req/s s node.js CPU na 100% (což znamená 50% spotřebu CPU na tomto dvoujádrovém boxu). Pojďme nahradit:

res.render( 'index', { items: items } );

od:

res.send( '<html lang="en"><head><title>Example</title></head><body><h1>Jade - node template engine</h1><div id="container"><ul id="users"><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li></ul></div></body></html>' );

Nyní se výsledek benchmarku blíží 2700 req/s. Úzké místo je tedy jednoznačně způsobeno formátováním stránky HTML.

Použití clusterového balíčku v této situaci je dobrý nápad a je to přímočaré. Kód lze upravit následovně:

var cluster = require('cluster')

if ( cluster.isMaster ) {
  for ( var i=0; i<2; ++i )
    cluster.fork();
} else {
  var
      express = require( 'express' ),
      app     = express.createServer(),
      redis   = require( 'redis' ).createClient();

  app.configure( function() {
      app.set( 'view options', { layout: false } );
      app.set( 'view engine', 'jade' );
      app.set( 'views', __dirname + '/views' );
      app.use( express.bodyParser() );
  });

  function log( what ) { console.log( what ); }

  app.get( '/', function( req, res ) {
      redis.lrange( 'items', 0, 50, function( err, items ) {
            if( err ) { log( err ); } else {
              res.render( 'index', { items: items } );
            }
      });
  });

  app.listen( 8080 );
}

Nyní se výsledek benchmarku blíží 750 req/s se 100% spotřebou CPU (ve srovnání s počátečními 475 req/s).




  1. Rychlý nebo hromadný upsert v pymongo

  2. Jak mohu vygenerovat ObjectId pomocí mongoose?

  3. Ovladač Mongo DB Java 3.x - Seskupit podle dotazu

  4. Přetrvává Redis data?