Эффективная работа с БД для большого RPS
Начал изучать джаву, решил сделать для примера простой REST API сервер, у него простые задачи:
- Принять запрос, сходить в БД узнать есть ли у пользователя привелегии на такой запрос
- Сходить в БД ещё раз, взять статью или создать новую
- Отрендерить ответ и отправить пользователю
Как видно, сервер в основном общается с БД, а сам по себе делает мало работы.
Мой вопрос о том, как обрабатывать максимальное количество запросов этим сервером.
Я не могу нагуглить ничего полезного про асинхронное взаимодействие в java, все предлагают только создавать треды, но меня интересует производительность, я хочу обрабатывать новые запросы пока жду ответа от БД и если для каждого запроса буду создавать новый тред, то закончатся ресурсы ОС, а если создать пулл тредов, то все равно можно попасть в ситуацию когда сервер не делает ничего полезного, а просто ждет пока 100 тредов получат ответ от БД, в это время ничего не делая с остальными запросами.
В nodejs нет такой проблемы из-за event loop, но я решил попробовать java, потому что у него хороший ООП и типизация. Какой подход используют java разработчики для эффективной обработки таких задач? И как вообще общаться с БД асинхронно? Если я что-то не правильно понимаю в тредах, поправьте меня пожалуйста
Ответы (1 шт):
Похоже вашу проблему лучше всего будет решить с помощью реактивного программирования.
В Java для этого есть достаточно много библиотек и фреймворков (Project Reactor, RxJava, Vert.x, Spring WebFlux и т.д.)
Простой пример реактивного REST на WebFlux с запросом к базе через SpringData+R2DBC можно найти, скажем, здесь
Также много примеров, статей и документации по реактивному программированию, библиотекам и фреймворкам можно найти через гугл