Redis
 sql >> база данни >  >> NoSQL >> Redis

Как да използвам клъстери Node.js с моето просто приложение Express?

Всъщност вашето работно натоварване всъщност не е обвързано с I/O:то е обвързано с процесора поради разходите за генериране на динамични страници, базирани на jade. Не мога да отгатна сложността на вашия нефритен шаблон, но дори и с прости шаблони, генерирането на HTML страници е скъпо.

За моите тестове използвах този шаблон:

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

Добавих 100 фиктивни низа към ключа за елементи в Redis.

На моята кутия получавам 475 req/s с node.js CPU на 100% (което означава 50% консумация на CPU на тази двуядрена кутия). Нека заменим:

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

от:

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

Сега резултатът от бенчмарка е близо до 2700 req/s. Така че затруднението очевидно се дължи на форматирането на HTML страницата.

Използването на клъстерния пакет в тази ситуация е добра идея и е ясна. Кодът може да бъде променен, както следва:

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

Сега резултатът от бенчмарка е близо до 750 req/s при 100 % консумация на процесора (за сравнение с първоначалните 475 req/s).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Какво е Express.js?

  2. Свързване на Hydra-CLI към Redis сървър за защита с парола?

  3. Препоръки за клиентска библиотека на Redis за използване от Scala

  4. Причинено от:java.lang.IllegalArgumentException:CONTAINING (1):[IsContaining, Containing, Contains]не се поддържа за извеждане на заявка за redis - Redis

  5. Не може да се свърже със сървъра Redis от Docker контейнера