Що являє собою подієва модель?
1. Що таке подієва модель у загальному сенсі
Подієва модель - це архітектурний принцип, за якого програма не виконує задачі послідовно, а реагує на події, що відбуваються в зовнішньому чи внутрішньому середовищі.
Замість "зроби це, потім це" → використовується принцип "коли станеться подія X - виконай дію Y".
Приклад для розуміння
Замість блокуючого коду:
const data = fs.readFileSync('file.txt');
console.log(data);у подієвій моделі:
fs.readFile('file.txt', (err, data) => {
console.log(data);
});Тут:
- Node.js не чекає, поки файл прочитається;
- вона реагує, коли система згенерує подію "читання завершено".
2. Як це влаштовано всередині Node.js
Подієва модель Node.js базується на двох ключових механізмах:
- EventEmitter - об'єкт, що генерує події й підписується на них.
- Event Loop (цикл подій) - механізм, що постійно перевіряє, чи є події чи callback-и, готові до виконання.
Спрощений цикл роботи Event Loop
while (програма працює) {
чекаємо подій (I/O, таймери, network)
якщо подія відбулася:
викликаємо її обробник (callback)
}3. Компоненти подієвої моделі
| Компонент | Опис |
|---|---|
| EventEmitter | "Джерело подій". Генерує (emit) події й викликає слухачів (on). |
| Event Loop | Цикл, що відстежує події й викликає callback-и. |
| Callback Queue | Черга задач (обробників подій), що чекають виконання. |
| libuv | Низькорівнева бібліотека, яка реалізує неблокуючий I/O та інтеграцію з ОС. |
4. Приклад життєвого циклу події
const fs = require('fs');
fs.readFile('file.txt', (err, data) => {
console.log('Файл прочитано!');
});Що відбувається "під капотом":
- Node.js надсилає задачу читання файлу в libuv (I/O API).
- libuv виконує операцію в окремому потоці пулу.
- Коли операція завершена, libuv генерує подію "готовий результат".
- Event Loop отримує цю подію.
- Callback із
readFile()поміщається в чергу подій. - Event Loop викликає callback → "Файл прочитано!" виводиться в консоль.
5. Чому подієва модель ефективна
| Перевага | Пояснення |
|---|---|
| Неблокуючий I/O | Потік не чекає завершення операцій - працює з іншими подіями. |
| Масштабованість | Один потік здатен обробляти тисячі з'єднань. |
| Менше ресурсів | Не потрібно створювати потік чи процес на кожне з'єднання. |
| Проста реактивна логіка | Замість циклів очікування - підписки на події (on, once). |
6. Коли подієва модель не підходить
Вона неефективна для CPU-інтенсивних задач (наприклад, обчислень, криптографії, парсингу відео). Поки потік зайнятий обчисленнями, він не може реагувати на інші події.
Рішення:
- використовувати Worker Threads;
- розбивати важкі задачі на асинхронні частини;
- виносити обчислення в окремий мікросервіс.
Підсумок
Подієва модель Node.js - це архітектура, де виконання програми керується подіями й реакціями на них, а не послідовним виконанням коду.
Вона базується на:
- EventEmitter (генерація подій),
- Event Loop (обробка подій),
- Callback Queue (черга зворотних викликів).
Завдяки цьому Node.js може ефективно виконувати неблокуючий I/O і обслуговувати десятки тисяч з'єднань в одному потоці.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.