Я начинаю работать над проектом, который использует PlayFramework
для приложения, которое начинает расти.Асинхронное приложение выглядит многообещающе, но вся асинхронная обработка (обработка исключений и ошибок, распараллеливание вызовов ...) добавляет много сложного и не связанного с бизнесом кода, что мне не очень нравится, так как я всегда стараюсь, чтобы мой код был наименьшимКомплекс возможен для проектов, которые будут разрабатываться годами.Насколько я понимаю, мне нужно только реализовать асинхронные методы, возвращающие CompletionStage
для блокировки вызовов внешних API REST и запросов к БД.
Я нашел много простых примеров на CompletionStage
, но я не уверен, чтохорошо понять, как структурировать большое асинхронное веб-приложение.Давайте возьмем PlayFramework в качестве примера.
Он использует Actions
, которые являются асинхронными по умолчанию: https://www.playframework.com/documentation/2.6.x/JavaAsync#Actions-are-asynchronous-by-default
Я понимаю, что весь код, включенный в этот метод действия, который не делаетвызовы во внешнюю систему будут асинхронными.Я могу писать длинные вычисления, циклы, работать с потоками, проводить рефакторинг своего кода в разных классах, слоях, методах, которые не возвращают CompletionStage , весь этот код все еще будет асинхронным.
Япрямо об этом?
Если теперь мне нужно сделать вызовы БД, доступ к файловой системе или вызовы REST к внешним API, мне нужно реализовать для каждого из этих вызовов метод, который возвращает CompletionStage.Я могу сделать join()
или get()
для этих методов, чтобы получить ответ и использовать его в своем бизнес-коде.
Будет ли всего этого достаточно, чтобы сделать мое приложение asynchronous
?Может ли кто-нибудь подтвердить или исправить мои вышеприведенные предположения и, возможно, объяснить, как все эти асинхронные рамки (Play, Vert.x) работают в фоновом режиме для обработки нескольких параллельных запросов?