Должен ли я реализовать все методы с CompletionStage в асинхронном приложении? - PullRequest
0 голосов
/ 01 июля 2019

Я начинаю работать над проектом, который использует 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) работают в фоновом режиме для обработки нескольких параллельных запросов?

...