Кластер-Хаб Nodejs. Обмен Сообщениями В Кластере, Запросы, Межпроцессные Монопольные Блокировки (Критические Разделы)

Работая в очередной раз с модулем кластера, я столкнулся с необходимостью обмена сообщениями между рабочими процессами.

К сожалению, стандартный функционал модуля позволяет отправлять сообщения только от мастер-процесса к рабочему, и в обратном направлении.

При этом никакого ответа на сообщение получить нет возможности, а очень хотелось бы.

Итак, я написал модуль кластера-концентратора.

Возможно, это будет кому-то полезно.

Модуль позволяет

  • Отправлять сообщения мастер-> работник, рабочий-> мастер, мастер-> мастер
  • Отправляйте запросы и получайте ответы (через обратный вызов)
  • Используйте эксклюзивные блокировки клавиш (критические разделы)
Если кому интересно, смотрите кат.

Обмен сообщениями

Самая простая функциональность — это просто отправка сообщений другим процессам.

Можно отправлять сообщения от мастера к работнику, от работника к мастеру, от мастера-> мастера.

  
  
   

var Hub = require('cluster-hub'); var cluster = require('cluster'); var hub = new Hub(cluster); if (cluster.isMaster) { var worker = cluster.fork(); hub.on('master-to-master', function (data) { console.log('master-to-master received'); }); hub.on('worker-to-master', function (data) { console.log('worker-to-master received'); }); hub.sendToMaster('master-to-master', 1); hub.sendToWorker(worker, 'master-to-worker'); } else { hub.on('master-to-worker', function () { console.log('master-to-worker received');; process.exit(); }); hub.sendToMaster('worker-to-master', 2); }



Отправка запросов

Этот функционал позволяет отправить запрос от одного процесса к другому и получить результат внутри функции обратного вызова.

Пример будет говорить сам за себя:

var Hub = require('cluster-hub'); var cluster = require('cluster'); var hub = new Hub(cluster); if (cluster.isMaster) { // in master process hub.on('sum', function (data, sender, callback) { callback(null, data.a + data.b); }); var worker = cluster.fork(); } else { //in worker process hub.requestMaster('sum', {a: 1, b:2}, function (err, sum) { console.log('Sum in worker: ' + sum); process.exit(); }); }

По аналогии вы можете использовать метод requestWorker для вызова метода рабочего процесса из главного процесса.



Ээксклюзивные замки/критические секции

Эта функциональность позволяет одному из процессов (неважно, главному или одному из рабочих) получить монопольный доступ к ресурсу.

Если рабочий процесс перестанет работать без вызова разблокировки заблокированного ресурса, ресурс будет освобожден автоматически.



var Hub = require('cluster-hub'); var cluster = require('cluster'); var hub = new Hub(cluster); if (cluster.isMaster) { var worker = cluster.fork(); hub.lock('foo', function (unlock) { console.log('foo lock in master'); setTimeout(unlock, 1000); }); } else { hub.lock('foo', function (unlock) { console.log('foo lock in worker 1'); setTimeout(unlock, 500); }); hub.lock('bar', function (unlock) { console.log('bar lock in worker'); unlock(); }) hub.lock('foo', function (unlock) { console.log('second foo lock in worker'); unlock(); process.exit(); }) }

Исходные коды модуля доступны здесь: github.com/sirian/node-cluster-hub Теги: #node.js #cluster #cluster-hub #JavaScript #node.js

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.