Давайте обсудим несколько причин, по которым нам нужно реактивное программирование, и что не так с традиционным подходом к API.
1. Поток на модель запроса
- Традиционное программирование обслуживает каждый запрос к серверу, назначая запросу один поток.
- Таким образом, в определенный момент времени максимальное количество одновременных запросов зависит от максимального количества потоков в пуле потоков сервера.
- Это поток для модели запроса.
- Это не значит, что мы можем слепо увеличивать количество потоков в пуле. Больше потоков означает меньше памяти, доступной для обработки.
2. Блокирующий и синхронный API
- Рассмотрим API, у которого есть вызов БД и запрос к другому API.
- В традиционном API, когда выполняется вызов БД/запрос API, он блокирует выполнение текущего API до тех пор, пока не будет получен ответ. Это функция блокировки
- Кроме того, количество времени, затраченное этим традиционным API, равно (время, затраченное на вызов БД + время, затраченное другим API).
- Если мы хотим улучшить время, нам нужно сделать эти вызовы асинхронными/неблокирующими.
3. Что, если бы мы использовали Callbacks/Future, чтобы сделать его асинхронным?
- Обратные вызовы сложны и трудны в обслуживании.
- Completable Future — это API, созданный поверх Future, но он не очень подходит для асинхронного вызова с несколькими элементами в качестве ответа и для обработки исключений.
4. Нет совместимости с обратным давлением
- Рассмотрим случай, когда API отправляет клиенту большой объем данных, и клиент не может обработать их все.
- Здесь было бы полезно, если бы у клиента был способ уведомить сервер о замедлении.
- Это называется совместимостью с обратным давлением.
- Это недоступно в традиционных API.
Так как же должен быть разработан лучший API?
- Асинхронный и неблокирующий.
- Отойдите от модели Thread per request.
- Используйте меньше потоков
- Совместимость с обратным давлением