sql >> Database teknologi >  >> NoSQL >> Redis

Hvordan bruger jeg Node.js-klynger med min simple Express-app?

Faktisk er din arbejdsbyrde ikke rigtig I/O-bundet:den er CPU-bundet på grund af omkostningerne ved jade-baseret dynamisk sidegenerering. Jeg kan ikke gætte kompleksiteten af ​​din jadeskabelon, men selv med simple skabeloner er det dyrt at generere HTML-sider.

Til mine test brugte jeg denne skabelon:

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

Jeg har føjet 100 dummy-strenge til elementnøglen i Redis.

På min boks får jeg 475 req/s med node.js CPU på 100% (hvilket betyder 50% CPU-forbrug på denne dual core boks). Lad os erstatte:

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

af:

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>' );

Nu er resultatet af benchmark tæt på 2700 req/s. Så flaskehalsen skyldes helt klart HTML-sidens formatering.

Det er en god idé at bruge klyngepakken i denne situation, og det er ligetil. Koden kan ændres som følger:

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 );
}

Nu er resultatet af benchmark tæt på 750 req/s med 100 % CPU-forbrug (skal sammenlignes med de oprindelige 475 req/s).




  1. Hvad er en TransientTransactionError i Mongoose (eller MongoDB)?

  2. Hvad er den mest tidseffektive måde at serialisere/deserialisere en datatabel til/fra Redis?

  3. Bedste Redis-bibliotek til Java

  4. Kan ikke starte Redis-serveren på grund af konfigurationsfilfejl