Чтение документации о Play Framework и ReactiveMongo заставляет меня поверить, что ReactiveMongo работает таким образом, что использует мало потоков и никогда не блокируется.
Однако кажется, что связь приложения Play с сервером Mongo должна происходить в каком-то потоке. Как это реализовано? Ссылки на исходный код для Play, ReactiveMongo, Akka и т. Д. Также были бы очень признательны.
Play Framework включает некоторую документацию по этому поводу на этой странице о пулах потоков. Это начинается:
Фреймворк Play - это снизу вверх асинхронный веб-фреймворк. Потоки обрабатываются асинхронно с использованием итераций. Пулы потоков в Play настроены на использование меньшего количества потоков, чем в традиционных веб-фреймворках, поскольку ввод-вывод в play-core никогда не блокируется.
Затем он немного рассказывает о ReactiveMongo:
Наиболее частое место, где типичное приложение Play блокирует, - это обращение к базе данных. К сожалению, ни одна из основных баз данных не предоставляет драйверы асинхронных баз данных для JVM, поэтому для большинства баз данных единственным вариантом является использование блокировки ввода-вывода. Заметным исключением из этого правила является ReactiveMongo, драйвер для MongoDB, который использует библиотеку Play Iteratee для взаимодействия с MongoDB.
Ниже приводится примечание об использовании фьючерсов:
Обратите внимание, что у вас может возникнуть соблазн поместить код блокировки в Futures. Это не делает его неблокирующим, это просто означает, что блокировка произойдет в другом потоке. Вам все равно нужно убедиться, что в пуле потоков, который вы используете, достаточно потоков для обработки блокировки.
Аналогичное примечание есть в документации Play на странице Обработка асинхронных результатов:
Вы не можете волшебным образом превратить синхронный ввод-вывод в асинхронный, заключив его в Future. Если вы не можете изменить архитектуру приложения, чтобы избежать блокировки операций, в какой-то момент эта операция должна быть выполнена, и этот поток будет заблокирован. Таким образом, помимо включения операции в Future, необходимо настроить ее для запуска в отдельном контексте выполнения, который был настроен с достаточным количеством потоков для работы с ожидаемым параллелизмом.
В документации, кажется, говорится, что ReactiveMongo не блокирует, поэтому вам не нужно беспокоиться о том, что он съедает много потоков в вашем пуле потоков. Но ReactiveMongo должен связываться с сервером Mongo где-нибудь.
Как реализована эта связь, чтобы Mongo не использовала потоки из пула потоков по умолчанию Play?
Еще раз, ссылки на определенные файлы в Play, ReactiveMongo, Akka и т. Д. Будут очень ценится.
in addition to enclosing the operation in a Future, it’s necessary to configure it to run in a separate execution context that has been configured with enough threads to deal with the expected concurrency
. Это звучит так, как будто он просто заблокируется в другом потоке. Знаете ли вы какие-либо ресурсы, которые сделали бы это более понятным? - person illabout   schedule 02.09.2014