Pull to refresh

Node.JS: Пример HTTP-сервера в режиме prefork с использованием Web Workers

Node.JS
Translation
Original author: Peter Griess
Как обещал ранее, я публикую исходный код, демонстрирующий, как построить HTTP-сервер в режиме prefork, используя Web Workers и новый API net.Server.listenFD(). Я надеюсь, что этот код будет хорошим примером того, как легко нагрузить несколько ядер сервера, комбинируя пересылку файловых дескрипторов и Web Workers.

В master.js мы создаём сокет, прикрепленный к порту 8080, и порождаем 4 рабочих процесса для обработки запросов. Мы отправляем сообщение каждому обработчику со текстом, которую нужно будет использовать для всех ответов на запросы, а также файловый дескриптор нашего сокета.

  1. var path = require('path');
  2. var netBindings = process.binding('net');
  3. var Worker = require('webworker').Worker;
  4. var fd = netBindings.socket('tcp4');
  5. netBindings.bind(fd, 8080);
  6. netBindings.listen(fd, 128);
  7. for (var i = 0; i < 3; i++) {
  8. var w = new Worker(path.join(__dirname, 'worker.js'));
  9. w.postMessage({ 'banner' : 'Hello, world!' }, fd);
  10. }


В worker.js мы создаём экземпляр HTTP-сервера, но не вызываем listen(). Вместо этого мы ожидаем принятия сообщений от родительского процесса. При получении события иы забираем файловый дескриптор из сообщения и используем его для привязки нашего экземпляра http.Server к сокету. Как только будет вызван http.Server.listenFD(), этот процесс начнёт обрабатывать запросы.

  1. var assert = require('assert');
  2. var http = require('http');
  3. var banner = undefined;
  4. var srv = http.createServer(function(req, resp) {
  5. resp.writeHead(200, {'Content-Type' : 'text/plain'});
  6. resp.write(banner + ' (pid ' + process.pid + ')\n');
  7. resp.end();
  8. });
  9. onmessage = function(msg) {
  10. assert.ok(msg.fd && msg.fd > 0);
  11. banner = msg.data.banner;
  12. srv.listenFD(msg.fd);
  13. };


Когда мы запускаем master.js, мы можем использовать curl для проверки, что запросы были обработаны разными процессами.

  1. % curl 'http://localhost:8080'
  2. Hello, world! (pid 27727)
  3. % curl 'http://localhost:8080'
  4. Hello, world! (pid 27728)
  5. % curl 'http://localhost:8080'
  6. Hello, world! (pid 27729)
  7. % curl 'http://localhost:8080'
  8. Hello, world! (pid 27727)


Очень просто.
Tags:node.jsсерверный javascriptprefork
Hubs: Node.JS
Total votes 37: ↑32 and ↓5+27
Views8K

Popular right now

Top of the last 24 hours