Как реализован ReactiveMongo, чтобы он считался неблокирующим?
Чтение документации по Play Framework и ReactiveMongo заставляет меня поверить, что ReactiveMongo работает таким образом, что использует несколько потоков и никогда не блокируется.
Однако, похоже, что связь между приложением Play и сервером Mongo должна происходить накакая-то нить где-то, Как это реализовано? Ссылки на исходный код для Play, ReactiveMongo, Akka и т. Д. Также будут очень благодарны.
Play Framework содержит некоторую документацию об этом на этой страницео пулах потоков, Это начинается с:
Play framework - это асинхронный веб-фреймворк снизу вверх. Потоки обрабатываются асинхронно с использованием итераторов. Пулы потоков в Play настроены для использованияменьше потоков, чем в традиционных веб-фреймворкахТак как IO в play-core никогда не блокируется.
Затем немного рассказывается о ReactiveMongo:
Наиболее распространенное место, которое блокирует типичное приложение Play, - это когда он общается с базой данных. К сожалению, ни одна из основных баз данных не предоставляет драйверы асинхронных баз данных для JVM, поэтому для большинства баз данных единственным вариантом является использование блокировки ввода-вывода.Заметным исключением является ReactiveMongoдрайвер для MongoDB, использующий библиотеку Iteratee от Play для связи с MongoDB.
Ниже приводится примечание об использовании фьючерсов:
Обратите внимание, что у вас может возникнуть желание обернуть ваш код блокировки в Futures. Это не делает его не блокирующим, это просто означает, чтоблокировка будет происходить в другом потоке, Вам все еще нужно убедиться, что в используемом там пуле потоков достаточно потоков, чтобы справиться с блокировкой.
Аналогичная заметка в документации Play на страницеОбработка асинхронных результатов:
Вы не можете волшебным образом превратить синхронный ввод-вывод в асинхронный, заключив его в будущее. Если вы не можете изменить архитектуру приложения, чтобы избежать блокирования операций,в какой-то момент эта операция должна быть выполнена, и этот поток собирается заблокировать, Таким образом, помимо включения операции в будущее, необходимо настроить ее на выполнение в отдельном контексте выполнения, который был настроен с достаточным количеством потоков для обработки ожидаемого параллелизма.
Документация говорит о том, что ReactiveMongo не блокирует, так что вам не нужно беспокоиться о том, что он съест много потоков в вашем пуле потоков. Но ReactiveMongo должен общаться с сервером Mongoгде-то.
Как реализовано это взаимодействие, чтобы Mongo не использовал потоки из пула потоков Play по умолчанию?
Еще раз, ссылки на конкретные файлы вИграть, ReactiveMongo, Akkaи т. д., будет очень признателен.