Play Framework и Node.js неблокирующее поведение для реляционных баз данных
Play Framework советует ретранслировать блокировку ввода-вывода в пул потоков соответствующего размера, например:
https://www.playframework.com/documentation/2.5.x/ThreadPools
Это относится к доступу к реляционной базе данных, потому что нет доступных неблокирующих JDBC-драйверов (за небольшим исключением).
В настоящее время я изучаю Node.JS, и я не мог понять, как это обрабатывается в Node. Я не видел необходимости кодировать мышление о пулах потоков в Node.
Итак, являются ли драйверы реляционной базы данных, используемые в Node.js, способными делать неблокирующие IO? Или эти вычисления передаются на какие-то рабочие потоки за кулисами?
В более широком смысле: какой правильный способ закодировать приложение Node.js, которое очень интенсивно для БД (реляционное)?
Ответы
Ответ 1
Node является однопоточным, поэтому нет пулов пользовательских потоков [1]. Вместо этого вам нужно масштабировать горизонтально с помощью более Node серверов. И вы можете сделать это в Node приложении: https://devcenter.heroku.com/articles/node-concurrency
И еще одна заметка: у меня был хороший успех с драйвером async-JDBC-ish postgresql-async. Я использовал его с jdub-async и scalikejdbc. Вот блог, который я написал об использовании его с помощью scalikejdbc: https://www.jamesward.com/2015/04/07/reactive-postgres-with-play-framework-scalikejdbc
[1] Пользовательский код работает с одним потоком (но вы можете использовать веб-работников для создания потоков), однако libuv является многопоточным. Подробнее: Как работает однопоточная неблокирующая IO-модель в Node.js
Ответ 2
Я думаю, вы в основном ответили на свой вопрос: в nodejs вам не нужно вводить код в терминах пулов потоков или так. Пулы потоков БД в Play присущи Java JDBC API. Драйверы Pure nodejs DB являются асинхронными по дизайну. Архитектура драйвера обертки nodejs зависит от версии обернутой библиотеки.
Ответ на более широкий вопрос:
Существует не так много различий между тем, как вы кодируете приложения с интенсивным использованием DB в nodejs или java, так как, скорее всего, ваше узкое место будет постоянным хранилищем за вашей БД независимо от платформы. Но в асинхронных архитектурах:
-
более естественно разработать систему, которая не будет перегружать вашу БД слишком большой нагрузкой
-
в случае замедления БД, приложение обычно не будет требовать больше системных ресурсов
Хороший драйвер БД позволит вам достичь вышеуказанных пунктов с помощью пулов управляемых пулов, тайм-аутов для каждого запроса, очередей запросов на соединение. Хотя некоторые из них также могут быть признаком интерфейса встроенного БД.