JavaRush /Курси /Модуль 5. Spring /Лекція 202: Принципи асинхронної комунікації: переваги та...

Лекція 202: Принципи асинхронної комунікації: переваги та виклики

Модуль 5. Spring
Рівень 13 , Лекція 1
Відкрита

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

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


Переваги асинхронної комунікації

Давай почнемо з хороших новин: асинхронність — це потужний інструмент, який може зробити вашу систему ефективнішою, масштабованішою та відмовостійкою.

Розглянемо основні переваги:

1. Незалежність компонентів

Асинхронний підхід робить взаємодію між сервісами слабкозв'язаною. Один сервіс відправляє подію, а його підписник обробляє повідомлення, коли готовий. Наприклад, у системі електронної комерції мікросервіс платіжної системи не повинен знати, хто обробляє повідомлення про платежі, якщо використовується брокер подій (Kafka).

Перевага: один сервіс може відправляти повідомлення в топіки, не переймаючись тим, які підписники їх оброблять.

2. Зниження латентності

У синхронних системах клієнт вимушений чекати відповіді від сервера. Чим більше таких очікувань, тим більші затримки. Асинхронність дозволяє клієнту відправити запит і одразу перейти до інших задач. Наприклад, користувач може завантажити файл в хмарне сховище, а стиснення файлу буде оброблене асинхронно.

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

3. Масштабованість

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

Перевага: система працює стабільно навіть при різкому зростанні навантаження.

4. Відмовостійкість

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

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

5. Обробка великих обсягів даних

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

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


Виклики та недоліки асинхронної комунікації

Тепер про те, чого варто остерігатися. синхронні підходи також ускладнюють життя розробникам. Які саме проблеми можуть виникнути?

Узгодженість даних

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

Виклик: потрібно проєктувати системи так, щоб вони вміли справлятися з такими тимчасовими невідповідностями.

Як вирішити: використовуйте підходи Event Sourcing або мастер-репліки для критичної інформації.

Складнощі відладки

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

Виклик: відстеження потоку подій і причин їхнього "згасання".

Як вирішити: впроваджуйте розподілену трасування (наприклад, Spring Sleuth з Zipkin) для відстеження подій між системами.

Повторна обробка повідомлень

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

Виклик: забезпечення ідемпотентності операцій.

Як вирішити: використовуйте унікальні ідентифікатори для повідомлень і відстежуйте, що їх уже обробили.

Втрата повідомлень

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

Виклик: гарантування доставки повідомлень між компонентами.

Як вирішити: використовуйте механізми гарантованої доставки повідомлень, наприклад, "At least once" або "Exactly once".

Складнощі моніторингу

Асинхронні системи потребують інструментів для моніторингу всіх компонентів ланцюжка: топіків, продюсерів, консьюмерів. Просте "все зелене" з REST-систем тут не працює.

Виклик: контролювати систему, щоб вчасно помічати проблеми.

Як вирішити: впроваджуйте системи моніторингу, такі як Prometheus і Grafana, щоб відстежувати метрики брокерів і сервісів.


Приклади асинхронної комунікації в реальних застосунках

Щоб закріпити матеріал, розглянемо кілька конкретних прикладів використання асинхронної комунікації.

  • Приклад 1. Розсилка сповіщень Коли користувач робить замовлення, магазин надсилає йому сповіщення на електронну пошту або в месенджер. Замість того, щоб робити це синхронно (чекати, поки повідомлення буде доставлене), мікросервіс створює подію OrderPlaced, а інший сервіс повідомлень підписується на цю подію і розсилає сповіщення.
  • Приклад 2. Оновлення кешу Мікросервіс обробки даних відправляє подію, коли оновлюються дані. Сервіси кешування підписуються на події і синхронізують кеш для швидкого читання.
  • Приклад 3. Обробка замовлень Великі інтернет-магазини використовують брокери повідомлень для управління замовленнями, щоб окремі кроки виконувалися асинхронно: підтвердження замовлення, списання коштів, пакування, доставка.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ