Я работаю с Play Framework (Scala) версии 2.3. Из документов:
Вы не можете волшебным образом превратить синхронный ввод-вывод в асинхронный, обернув его в Future. Если вы не можете изменить архитектуру приложения, чтобы избежать блокировки операций, в какой-то момент эту операцию придется выполнить, и этот поток будет заблокирован. Таким образом, в дополнение к включению операции в Future необходимо настроить ее для запуска в отдельном контексте выполнения, который был настроен с достаточным количеством потоков для работы с ожидаемым параллелизмом.
Это меня немного смутило, как настроить мое веб-приложение. В частности, поскольку в моем приложении большое количество блокирующих вызовов: сочетание вызовов JDBC и вызовов сторонних служб с использованием блокирующих SDK, какова стратегия настройки контекста выполнения и определения количества предоставляемых потоков? Нужен ли мне отдельный контекст выполнения? Почему я не могу просто настроить пул по умолчанию, чтобы иметь достаточное количество потоков (и если я это сделаю, зачем мне по-прежнему нужно оборачивать вызовы в Future?)?
Я знаю, что в конечном итоге это будет зависеть от специфики моего приложения, но мне нужны рекомендации по стратегии и подходу. Документация по игре проповедует использование неблокирующих операций везде, но на самом деле типичное веб-приложение, обращающееся к базе данных sql, имеет много блокирующих вызовов, и после прочтения документации у меня сложилось впечатление, что этот тип приложения будет работать далеко не оптимально с конфигурациями по умолчанию.