Воспринимай каждый воркер как если бы он был запущен на удаленной машине, которая ничего не знает о другом воркере, который запущен на другой удаленной машине. Тогда станет ясно, что задачи следует складывать в сервер очередей, а тот уже раскидает задачи по воркерам так, чтобы они не пытались выполнять одновременно одну и ту же задачу.
Для очередей можно использовать
kue. Работает поверх redis, который многие итак используют для масштабирования приложения по нескольким физически удаленным серверам, кеширования и всего прочего.
Конфиг можно подключать в индексном файле и отдавать каждой копии приложения.
const Application = require('path/to/Application');
const config = require('path/to/config');
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
new Application(config).run();
}
Про сокеты не совсем понял. Приложение пытается куда-то приконектиться и выступает в роли клиента или приложение пытается поднять свой сокет сервер ?