Как реализован 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и т. д., будет очень признателен.

Ответы на вопрос(1)

Ваш ответ на вопрос