Skip to main content

Що являє собою подієва модель?

1. Що таке подієва модель у загальному сенсі

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

Замість "зроби це, потім це" → використовується принцип "коли станеться подія X - виконай дію Y".

Приклад для розуміння

Замість блокуючого коду:

javascript
const data = fs.readFileSync('file.txt'); console.log(data);

у подієвій моделі:

javascript
fs.readFile('file.txt', (err, data) => { console.log(data); });

Тут:

  • Node.js не чекає, поки файл прочитається;
  • вона реагує, коли система згенерує подію "читання завершено".

2. Як це влаштовано всередині Node.js

Подієва модель Node.js базується на двох ключових механізмах:

  1. EventEmitter - об'єкт, що генерує події й підписується на них.
  2. Event Loop (цикл подій) - механізм, що постійно перевіряє, чи є події чи callback-и, готові до виконання.

Спрощений цикл роботи Event Loop

javascript
while (програма працює) { чекаємо подій (I/O, таймери, network) якщо подія відбулася: викликаємо її обробник (callback) }

3. Компоненти подієвої моделі

КомпонентОпис
EventEmitter"Джерело подій". Генерує (emit) події й викликає слухачів (on).
Event LoopЦикл, що відстежує події й викликає callback-и.
Callback QueueЧерга задач (обробників подій), що чекають виконання.
libuvНизькорівнева бібліотека, яка реалізує неблокуючий I/O та інтеграцію з ОС.

4. Приклад життєвого циклу події

javascript
const fs = require('fs'); fs.readFile('file.txt', (err, data) => { console.log('Файл прочитано!'); });

Що відбувається "під капотом":

  1. Node.js надсилає задачу читання файлу в libuv (I/O API).
  2. libuv виконує операцію в окремому потоці пулу.
  3. Коли операція завершена, libuv генерує подію "готовий результат".
  4. Event Loop отримує цю подію.
  5. Callback із readFile() поміщається в чергу подій.
  6. Event Loop викликає callback → "Файл прочитано!" виводиться в консоль.

5. Чому подієва модель ефективна

ПеревагаПояснення
Неблокуючий I/OПотік не чекає завершення операцій - працює з іншими подіями.
МасштабованістьОдин потік здатен обробляти тисячі з'єднань.
Менше ресурсівНе потрібно створювати потік чи процес на кожне з'єднання.
Проста реактивна логікаЗамість циклів очікування - підписки на події (on, once).

6. Коли подієва модель не підходить

Вона неефективна для CPU-інтенсивних задач (наприклад, обчислень, криптографії, парсингу відео). Поки потік зайнятий обчисленнями, він не може реагувати на інші події.

Рішення:

  • використовувати Worker Threads;
  • розбивати важкі задачі на асинхронні частини;
  • виносити обчислення в окремий мікросервіс.

Підсумок

Подієва модель Node.js - це архітектура, де виконання програми керується подіями й реакціями на них, а не послідовним виконанням коду.

Вона базується на:

  • EventEmitter (генерація подій),
  • Event Loop (обробка подій),
  • Callback Queue (черга зворотних викликів).

Завдяки цьому Node.js може ефективно виконувати неблокуючий I/O і обслуговувати десятки тисяч з'єднань в одному потоці.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.