Как правильно использовать базу данных при масштабировании приложения NodeJS? - PullRequest
0 голосов
/ 20 октября 2018

Мне интересно, как бы я правильно использовал MySQL, когда масштабирую свое приложение Node.JS, используя модуль cluster.В настоящее время у меня есть только два решения:

Решение 1 :

Создание подключения к базе данных на каждом "работнике".

Решение 2 :

Имейте соединение с базой данных на главном процессе, и всякий раз, когда один из рабочих запрашивает некоторые данные, мастер-процесс возвращает данные.Однако, используя это решение, я не знаю, как я смогу заставить работника извлекать данные из основного процесса.

Я (думаю) сделал «хакерский» обходной путь, генерируя уникальный номер и затем ожидая, пока мастер-процесс отправит сообщение обратно работнику, а имя события будет уникальным номером.

Если вы не понимаете, что я имею в виду под этим, вот код:

// Worker process

return new Promise (function (resolve, reject) {
    process.send({
        // Other data here
        identifier: <unique number>
    })

    // having a custom event emitter on the worker

    worker.once(<unique number>, function (data) {
        // data being the data for the request with the unique number

        // resolving the promise with returned data
        resolve(data)
    })
})

//////////////////////////

// Master process

// Custom event emitter on the master process

master.on(<eventName>, function (data) {
    // logic

    // Sending data back to worker
    master.send(<other args>, data.identifier)
}

Каков наилучший подход к этой проблеме?

Спасибо зачтение.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

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

0 голосов
/ 20 октября 2018

Когда вы кластеризуете в NodeJS, вы должны предполагать, что каждый процесс полностью независим.Вы действительно не должны ретранслировать подобные сообщения в / из главного процесса.Если вам нужны несколько потоков для доступа к одним и тем же данным, я не думаю, что вы должны использовать NodeJS.Однако, если вы просто выполняете базовые операции CRUD с вашей базой данных, кластеризация (решение 1), безусловно, является правильным решением.

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

...