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, так как, скорее всего, ваше узкое место будет постоянным хранилищем за вашей БД независимо от платформы. Но в асинхронных архитектурах:

  • более естественно разработать систему, которая не будет перегружать вашу БД слишком большой нагрузкой

  • в случае замедления БД, приложение обычно не будет требовать больше системных ресурсов

Хороший драйвер БД позволит вам достичь вышеуказанных пунктов с помощью пулов управляемых пулов, тайм-аутов для каждого запроса, очередей запросов на соединение. Хотя некоторые из них также могут быть признаком интерфейса встроенного БД.