ENOTSUP errnoException в NodeJS с использованием mssql в кластере работника

Я пытаюсь подключиться к базе данных SQL Server внутри работника кластера. Я использую node-mssql и Tedious в качестве драйвера. Вот мой тестовый код.

'use strict';

var os = require('os');
var numCPUs = os.cpus().length;    
var cluster = require('cluster');
var mssql = (cluster.isMaster == false ? require('mssql') : null);

function workerLog(msg) {
    process.send({msg:"CLUSTER-NODE-"+cluster.worker.id+": "+msg});
}

if(cluster.isMaster == true) {
    console.log("MASTER: "+"SPAWNING "+numCPUs+" CLUSTER NODES");
    for(var i = 0; i < numCPUs; i++) {
        var worker = cluster.fork();
        worker.on('message', function(msg) {
            console.log(msg.msg);
        });
    }

    var timeOuts = [];
    var workerError = function(workerId) {
        console.log("MASTER: "+"AN EXECUTION ISSUE OCCURRED WITH CLUSTER NODE "+workerId);
    };
    cluster.on('fork', function(worker) {
        timeOuts[worker.id] = setTimeout(workerError,10000,worker.id);
        console.log("MASTER: "+"SPAWNED CLUSTER NODE "+worker.id);
    });
    cluster.on('online', function(worker) {
        console.log("MASTER: "+"CLUSTER NODE "+worker.id+" COMING ONLINE");
    });
    cluster.on('listening', function(worker,address) {
        clearTimeout(timeOuts[worker.id]);
        console.log("MASTER: "+"CLUSTER NODE "+worker.id+" IS LISTENING");
    });
    cluster.on('disconnect', function(worker) {
        console.log("MASTER: "+"CLUSTER NODE "+worker.id+" HAS DISCONNECTED");
    });
    cluster.on('exit', function(worker,code,signal) {
        clearTimeout(timeOuts[worker.id]);
        console.log("MASTER: "+"CLUSTER NODE "+worker.id+" HAS EXITED");
    });
} else {
    var dbName = "Prefs";
    var cfg = {
        driver: 'tedious',
        user: 'webmi',
        password: 'webmi01',
        server: "localhost\\SQLEXPRESS",
        database: dbName,
        options: {
            useColumnNames: true,
            isolationLevel: 1, // READ_UNCOMMITTED
            connectionIsolationLevel: 1 // READ_UNCOMMITTED
        }
    };
    var dbConn = new mssql.Connection(cfg);
    workerLog("CONNECT TO "+dbName);
    dbConn.connect().then(function() {
        if(dbConn.connected) {
            workerLog("CONNECTION TO "+dbName+" EXISTS");
        } else {
            workerLog("NOT CONNECTED TO "+dbName+" BUT NO ERROR DETECTED");
        }
    }).catch(function(error) {
        workerLog("CANNOT CONNECT TO DATABASE\n"+error.stack);
    });
}

И вот что я получаю, когда запускаю его: node test.js

D:\proj\CTech\9.2\Bin\Node>node test.js
MASTER: SPAWNING 2 CLUSTER NODES
MASTER: SPAWNED CLUSTER NODE 1
MASTER: SPAWNED CLUSTER NODE 2
MASTER: CLUSTER NODE 1 COMING ONLINE
MASTER: CLUSTER NODE 2 COMING ONLINE
CLUSTER-NODE-2: CONNECT TO Prefs
CLUSTER-NODE-1: CONNECT TO Prefs
events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: write ENOTSUP
    at exports._errnoException (util.js:746:11)
    at ChildProcess.target._send (child_process.js:484:28)
    at ChildProcess.target.send (child_process.js:416:12)
    at sendHelper (cluster.js:676:8)
    at send (cluster.js:512:5)
    at cluster.js:488:7
    at SharedHandle.add (cluster.js:99:3)
    at queryServer (cluster.js:480:12)
    at Worker.onmessage (cluster.js:438:7)
    at ChildProcess.<anonymous> (cluster.js:692:8)

D:\proj\CTech\9.2\Bin\Node>

Смотря на child_process.js, Похоже, что работник пытается отправить дескриптор соединения обратно к мастеру (для совместного использования?), Но я могу ошибаться в этом. В любом случае рабочий отказывает при попытке отправки.

Есть ли способ предотвратить эту ошибку? Или есть способ, чтобы работник НЕ пытался поделиться этим дескриптором с мастером?

0 ответов

Другие вопросы по тегам