Основна помилка з реалізацією event-driven архітектур

Основна помилка полягає у тому, що більшість розробників використовують події (events) не як повідомлення про зміни, що відбулися, а як команди. У такому випадку відбувається більш сильне зв’язування сервісів у системі, оскільки вони знають один про одний та починають оркеструвати роботу інших сервісів.

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

Розглянемо приклад інтернет-магазину, де окрім інших є два наступні сервіси:

  • сервіс через який клієнт оформлює замовлення (A)
  • сервіс через який менеджери з продажів обслуговують замовлення (B)

Сервіс, який оформлює замовлення (A) отримує список покупок від покупця і контактні дані та зберігає замовлення.

Сервіс з яким працюють менеджери з продажів (B) розкидує завдання між менеджерами аби ті дзвонили клієнтам для підтвердження замовлень та у випадку підтвердження передавали обробку замовлень далі, наприклад, на склад.

Помилка

Сервіс A має якось повідомити про нове замовлення інші сервіси, зокрема сервіс через B. Явною помилкою буде безпосередне звернення A до B, оскільки, в цьому випадку A має знання про B.

Менш очевидною помилкою є додавання в чергу повідомлення про те, що сервіс B має опрацювати нове замовлення. Нехай це повідомлення називається “ConfirmOrder”. Назва “ConfirmOrder” – вже виглядає як команда.

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

Правильне рішення

Правильним рішенням буде повідомлення про те, що замовлення було зареестроване. У такому випадку сервіс лише повідомляє про те, що він завершив роботу і якщо комусь для чогось необхідні результати його роботи, то вони можуть їх отримати, підписавшись на подію реестрації замовлення. Воно може називатися просто “Order” або “OrderCreated”. У такому випадку сервіс А не знає нічого зайвого і ми отримуєму слабдку сплутаність (low coupling).

Coupling of services depending on communication approach
Сплутаність залежно від типу комунікацій

P.S.

Мова йде не лише про сервісну чи мікро-сервісну архітектури, а про роботу з подіями взагалі. Наприклад, ця ж рекомендація буде корисною і для роботи з DOM подіями у браузері.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *