Асинхронное программирование, особенно в микросервисных архитектурах, где сервисы часто ожидают ответов от других сервисов, кажется логичным решением для эффективного использования потоков. Однако, практика показывает, что переход к неблокирующему API не всегда ведет к заметному улучшению производительности, а иногда даже может ухудшить ее.
На примере высоконагруженного сервиса, выполняющего множество внешних запросов, выяснилось, что переход от блокирующих потоков к неблокирующим не привел к ожидаемому увеличению скорости обработки запросов. Несмотря на сокращение количества потоков, нагрузка на CPU осталась прежней, а проблема с исчерпанием файловых дескрипторов в периоды замедления работы сервиса осталась актуальной.
Более того, эксперимент с высоконагруженным сервисом, изначально написанным в неблокирующем стиле, показал, что переписывание его в блокирующий с пулом потоков, привело к увеличению производительности на 15%. Это говорит о том, что Spring и неблокирующий Tomcat могут создавать дополнительную нагрузку, особенно при обработке десятков тысяч запросов в секунду.
Таким образом, использование асинхронности оправдано при большом количестве внешних вызовов и предпочтении реактивного стиля программирования. Однако необходимо осознавать возможный оверхед производительности и подходить к выбору инструментов с учетом конкретных потребностей проекта, а не слепо следовать модным тенденциям.
Изображение носит иллюстративный характер
На примере высоконагруженного сервиса, выполняющего множество внешних запросов, выяснилось, что переход от блокирующих потоков к неблокирующим не привел к ожидаемому увеличению скорости обработки запросов. Несмотря на сокращение количества потоков, нагрузка на CPU осталась прежней, а проблема с исчерпанием файловых дескрипторов в периоды замедления работы сервиса осталась актуальной.
Более того, эксперимент с высоконагруженным сервисом, изначально написанным в неблокирующем стиле, показал, что переписывание его в блокирующий с пулом потоков, привело к увеличению производительности на 15%. Это говорит о том, что Spring и неблокирующий Tomcat могут создавать дополнительную нагрузку, особенно при обработке десятков тысяч запросов в секунду.
Таким образом, использование асинхронности оправдано при большом количестве внешних вызовов и предпочтении реактивного стиля программирования. Однако необходимо осознавать возможный оверхед производительности и подходить к выбору инструментов с учетом конкретных потребностей проекта, а не слепо следовать модным тенденциям.