Пропустити навігацію EPAM

Чому асинхронний код став трендом?

Назарій Романків

Lead Software Engineer, AWS Certified Solutions Architect - Associate
Думка експерта
  • JavaScript
  • Software Engineering

За останнє десятиліття асинхронне програмування стало дуже популярним підходом. Однак, чи замислювалися ви коли-небудь, чому ми замінили виконання синхронного коду - асинхронним? Давайте зануримося глибше в цю тему та дізнаємося, чому ми зробили такий перехід, а також проаналізуємо плюси та мінуси асинхронного програмування.

Як працюють сервери в синхронному режимі

Для того, щоб зрозуміти, чому асинхронне програмування стало таким популярним, нам потрібно зрозуміти, як працюють синхронні сервери. Почнемо з основ, коли є клієнт (ПК) і сервер, і клієнт спілкується з сервером через Інтернет.

Щоразу, коли сервер отримує запит, він створює новий потік. Так, всі операції, пов’язані із запитом, виконуються всередині цього потоку. Такий принцип роботи є зручним, оскільки ми маємо контекст користувача, і усі процеси є відокремленими.

Чому синхронний сервер важко масштабувати

Тепер, коли ми знаємо, що зазвичай для кожного запиту створюється окремий потік, настав час поговорити про багатозадачність і паралельність процесів. Кожен комп’ютер має ЦП (центральний процесор), який відповідає за обчислення та виконання операцій, які ми запрограмували за допомогою нашого коду. ЦП має певну кількість ядер, і кожне ядро може виконувати один потік за раз.

Зазвичай ядер за кількістю нараховується менше, ніж потоків для виконання, і тому ОС (операційна система) керує нашим апаратним забезпеченням таким чином, щоб розподіляти процесорний час на всі потоки якомога ефективніше. Щоб не заглиблюватися в цю тему, давайте припустимо, що це просто надає кожному потоку однакову кількість процесорного часу. Такий підхід називається псевдо паралелізмом. Так, наша ОС перемикає потік, який виконує кожен ЦП, що виглядає, як паралельне виконання кожного потоку.

Саме тут і виникає проблема. Перемикання потоку для ЦП – недешева операція, і чим більше у вас потоків, тим більше часу ваш ЦП витрачає на перемикання між потоками, а не на виконання фактичного коду, що призводить до затримки відповіді через нестачу процесорного часу.

Як асинхронний сервер використовує ресурси

Нарешті настав час поговорити про асинхронний код. Суть асинхронного програмування полягає у тому, що у ньому використовуються головний потік (потік, у якому реалізується ваша бізнес-логіка), який відповідає клієнтам, розвантажуючи більшість операцій, таких як введення/виведення (наприклад, читання файлу) і пул потоків (або робочий пул) для виконання операцій, які інтенсивно завантажують ЦП. Пул не повинен мати більше потоків, ніж кількість ядер, які налічує ЦП на вашому сервері.

Кожного разу, коли вам потрібно зробити щось поза межами головного потоку, ви повинні «запланувати» виконання завдання, поставивши його в чергу. Після цього, якщо у вашому пулі з’явиться незадіяний потік, він виконає це завдання.

Такий підхід певною мірою вирішує проблему масштабування вашого сервера, оскільки тепер ваш ЦП витрачає більше часу на роботу над запитами, що помітно збільшує кількість обробки одночасних запитів вашим єдиним сервером.

Недоліки асинхронного сервера

Основним недоліком асинхронного коду є те, що у вас є лише один «головний» потік, у якому більшість часу реалізується вся ваша бізнес-логіка, а решту завдань зазвичай обробляє ваш асинхронний механізм.

Зважаючи на те, що ваша бізнес-логіка реалізується в одному потоці, у разі, якщо у вас є фрагмент коду, який виконується надто довго (так званий блокатор), ваш сервер стане працювати повільно і навряд чи відповідатиме іншим клієнтам, оскільки він буде зайнятий обробкою лише одного із кількох запитів.

Підсумки

Асинхронний код — це інструмент, і, як і будь-який інший інструмент, вам потрібно знати, коли його слід використовувати. Важливо розуміти, що це не панацея, яка зможе вирішити всі ваші проблеми, а радше палка з двома кінцями, яка може завдати вам шкоди, якщо ви використаєте її неправильно.

У наступній статті ми поговоримо про подолання недоліків роботи асинхронного сервера на прикладі Node.js.

«Моя кар’єра в EPAM розвивалася доволі стрімко». Досвід Назарія Романківа

В EPAM я прийшов у 2019 році, ще будучи студентом університету. Спочатку у компанії я навчався на курсах для початківців і мав чудову можливість отримати знання за напрямком, який мене цікавив найбільше на той час.

Підписатися на новини

Чудово! Ми вже готуємо добірку актуальних новин для вас :)

Вибачте, щось пішло не так. Будь ласка, спробуйте ще раз.

* Обов'язкові поля

*Будь ласка, заповніть обов’язкові поля

Вакансії EPAM Ukraine у Київ | Львів | Харків | Дніпро | Вінниця | Івано-Франківськ | Одеса | Чернівці | Хмельницький | Рівне | Ужгород | Тернопіль | Луцьк за напрямком Java | JavaScript | .NET | DevOps | Experience Design | Software Testing | Business Analysis | Python| Big Data | Mobile | Solution Architect | Ruby on Rails у містах за напрямком Java вакансії Київ | Java вакансії Харків | Java вакансії Львів | Java вакансії Вінниця | Java вакансії Одеса | Java вакансії Івано-Франківськ | Java вакансії Чернівці | Java вакансії Хмельницький | Java вакансії Рівне | Java вакансії Ужгород | Java вакансії Тернопіль | Java вакансії Луцьк | JavaScript вакансії Київ | JavaScript вакансії Харків | JavaScript вакансії Львів | JavaScript вакансії Вінниця | JavaScript вакансії Одеса | JavaScript вакансії Івано-Франківськ | JavaScript вакансії Чернівці | JavaScript вакансії Хмельницький | JavaScript вакансії Рівне | JavaScript вакансії Ужгород | JavaScript вакансії Тернопіль | JavaScript вакансії Луцьк | DevOps вакансії Київ | DevOps вакансії Харків | DevOps вакансії Львів | DevOps вакансії Вінниця | DevOps вакансії Одеса | DevOps вакансії Івано-Франківськ | DevOps вакансії Чернівці | DevOps вакансії Хмельницький | DevOps вакансії Рівне | DevOps вакансії Ужгород | DevOps вакансії Тернопіль | DevOps вакансії Луцьк