Site icon IT Education Center Blog – блог навчального центру DevOps – ITEDU by NETFORCE Group

Відмінності архітектурних станів у вебсервісах

Чому одні сервіси пам’ятають попередні дії користувача, а інші сприймають кожен запит як новий? Відповідь ховається в концепціях Stateful і Stateless, які лежать в основі сучасних програмних систем. 

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

Що таке стан? 

Перш ніж розбиратися з типами станів, варто зрозуміти, що таке стан у контексті комп’ютерних систем.

У комп’ютерних системах стан — це інформація, яку застосунок пам’ятає в конкретний момент часу. Наприклад, дані про авторизованого користувача, вміст кошика в інтернет-магазині або результати попередніх дій. 

Що таке Stateful

Коли застосунок є Stateful, він зберігає цю інформацію між запитами та використовує її під час обробки нових дій користувача.

Щоб краще зрозуміти принцип роботи Stateful-систем, розгляньмо його на прикладі binary — мови нулів та одиниць.

Уявіть, що вам дали такі інструкції:

У такій ситуації ваша відповідь завжди залежатиме від поточного значення на екрані. Ви не зможете відповісти, не враховуючи цю інформацію. Тобто, результат кожної дії визначається поточним станом системи.

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

Як працюють Stateful вебсервіси

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

  1. Ви вводите логін і пароль.
  2. Сервер перевіряє облікові дані та створює для вас активну сесію.
  3. Система запам’ятовує, що саме ви є авторизованим користувачем.
  4. Ви переходите до профілю, історії замовлень або кошика.
  5. Сервер використовує збережену інформацію про вашу сесію, щоб показати персоналізовані дані.

У результаті кожен новий запит обробляється не ізольовано, а з урахуванням уже відомого контексту. Сервер знає, хто саме звертається до нього, і формує відповідь на основі цієї інформації.

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

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

Саме тому Stateful-підхід зазвичай використовують там, де контекст взаємодії є критично важливим для роботи сервісу.

Що таке Stateless

Розв’язанням цих проблем став підхід Stateless — повна протилежність Stateful-системам. У такій архітектурі сервер не зберігає інформацію про попередні запити, а кожне нове звернення обробляється незалежно від попередніх.

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

У такому випадку: 

Кожна взаємодія розглядається окремо, тому серверу не потрібно пам’ятати попередні дії користувача. Саме на цьому принципі побудовані Stateless-системи.

Як працюють Stateless вебсервіси

Ми взаємодіємо зі Stateless-сервісами щодня, коли шукаємо інформацію в Google, читаємо новини, перевіряємо погоду або працюємо з API.

Розгляньмо приклад API-запиту для отримання списку повідомлень:

GET https://api.example.com/direct_messages?since_id=240136858829479935&count=1

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

Поглянемо на ще один приклад — створення нового запису через POST-запит:

POST https://api.example.com/entity

Host: api.example.com

Content-Type: application/json

{

  "id": 1,

  "title": "Example",

  "description": "This is an example"

}

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

Саме тому REST-архітектура тісно пов’язана зі Stateless-підходом. Її ключовий принцип полягає в тому, що кожна дія має містити достатньо інформації для обробки, а сервер не повинен покладатися на збережений стан клієнта між зверненнями. Завдяки цьому RESTful-сервіси простіше масштабувати, кешувати та підтримувати.

Ключова різниця між Stateful VS Stateless

На цьому етапі може здатися, що відрізнити Stateful від Stateless дуже просто. Проте сучасні вебсервіси настільки майстерно відтворюють патерни Stateful-систем, що користувач може навіть не помітити різниці.

Ключова різниця між Stateful і Stateless полягає не в наявності стану як такого, а в тому, де саме зберігається інформація про користувача та його попередні дії.

Тому Stateless не означає повну відсутність стану — сервер просто не відповідає за його довгострокове зберігання.

На цьому етапі може виникнути логічне запитання: якщо сучасні вебсервіси не зберігають стан на сервері, то як вони пам’ятають користувача? 

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

Повертаючись до інтернет-магазину: якби він був повністю Stateless, після оформлення замовлення сервер одразу забував би про користувача. Він не пам’ятав би адресу доставки, спосіб оплати, вміст кошика чи попередні покупки, що було б незручним для більшості сучасних сервісів.

Тому на практиці часто використовують компромісний підхід: частина даних зберігається на стороні клієнта та передається під час кожного нового звернення. Наприклад, після авторизації саме cookie або токен повідомляє серверу, хто ви, дозволяючи зберегти персоналізацію без відмови від переваг Stateless-архітектури.

Оскільки межа між станами не завжди очевидна, ми узагальнили їхні ключові особливості в таблиці: 

ХарактеристикаStatefulStateless
Де зберігається стан?На сервері у вигляді сесії або іншого стану На клієнті або передається разом із запитом
Як сервер обробляє нові запити?З урахуванням попередніх взаємодій Незалежно один від одного
Масштабування Складніше масштабувати через необхідність синхронізації стануЛегше масштабувати, оскільки сервер не зберігає контекст 
Що створюється під час взаємодіїСесіяНезалежні запити
ПрикладиОсобистий кабінет, онлайн-банкінг, кошик інтернет-магазинуREST API з токеном автентифікації, пошукові запити

Недоліки серверних сесій у вебсервісах

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

Розглянемо роботу служби підтримки. Оператору не потрібно пам’ятати історію кожного клієнта — усі необхідні дані вже містяться в картці звернення. Завдяки цьому він може однаково ефективно працювати як із десятками, так і з тисячами запитів.

Схожий принцип працює і у вебсервісах. Якщо сервер зберігає стан кожного клієнта, масштабування системи ускладнюється. Натомість коли необхідний контекст передається разом із запитом, навантаження простіше розподіляти між кількома серверами.

Використання серверних сесій створює кілька додаткових викликів:

Для багатьох сучасних вебсервісів Stateless-підхід є гнучкішим рішенням.

Підсумовуючи

Як бачимо, за цими поняттями стоїть цілий пласт архітектурних рішень, які впливають на масштабованість, продуктивність та зручність роботи загалом. Розуміння принципів Stateful i Stateless допомагає не лише читати технічну документацію, а й усвідомлювати, чому сучасні сервіси працюють саме так.

Сподіваємося, нам вдалося розкласти все по поличках і показати різницю між ними не лише в теорії, а й на практиці.

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

Exit mobile version