Нинішня ситуація
Ми реалізуємо (і зараз підтримуємо) веб-додаток для покупок в Інтернеті в архітектурі мікросервісів.
Однією з вимог є те, що бізнес повинен мати можливість застосовувати правила щодо того, що наші клієнти додають у свій кошик, щоб налаштувати їхній досвід та можливе замовлення. Цілком очевидно, що для цього потрібно було створити механізм ділових правил, і ми реалізували для цього специфічну «мікросервіс» (якщо ми ще могли це так назвати).
За рік цей механізм правил стає дедалі складнішим, вимагаючи все більшої кількості даних (наприклад, вміст кошика, а також інформація про користувача, його роль, наявні послуги, деяку платіжну інформацію тощо), щоб мати можливість обчислити ці правила.
Наразі наша shopping-cart
мікросервіс збирає всі ці дані з інших мікросервісів. Незважаючи на те, що частина цих даних використовується shopping-cart
, більшу частину часу вона в основному використовується для подачі механізму роботи з правилами.
Нові вимоги
Тепер з'являється потреба в інших додатках / мікросервісах для повторного використання механізму правил для подібних вимог. У цій ситуації їм, таким чином, доведеться передавати один і той же тип даних, викликати ті самі мікросервіси та створювати (майже) ті самі ресурси, щоб мати змогу викликати двигун правил.
Продовжуючи, як є, ми зіткнемося з кількома проблемами:
- кожен (виклик механізму правил) повинен повторно виконувати отримання даних, навіть якщо вони не потрібні для себе;
- запити до двигуна правил є складними;
- продовжуючи в цьому напрямку, нам доведеться транспортувати ці дані по всій мережі для багатьох запитів (подумайте про μs A, що викликає μs B, викликає двигун правил, але A вже має деякі дані, необхідні двигуну правил);
shopping-cart
стала величезною завдяки всім отриманим даним;- Я, мабуть, забуду багатьох ...
Що ми можемо зробити, щоб уникнути цих неприємностей?
В ідеалі ми б уникали додаткових складностей у системі двигунів. Ми також повинні переконатися, що він не стає вузьким місцем - наприклад, деякі дані доволі повільно отримують (10s або навіть більше), тому ми реалізували попереднє отримання shopping-cart
таким чином, що дані, швидше за все, будуть там, перш ніж називати правила двигуна та зберегти прийнятну роботу користувачів.
Деякі ідеї
- Нехай механізм правил забирає необхідні йому дані. Це додало б їй ще більшої складності, порушуючи принцип єдиної відповідальності ( ще більше… );
- Внесіть проксі-мкс перед системою правил для отримання даних;
- Реалізуйте μs "виборці даних", який закликає двигун правил отримувати всі необхідні йому дані одразу (складений запит).
shopping-cart
, але ми можемо досить легко адаптувати його для потреб інших мікросервісів (вони все ще пов'язані з користувачами, продуктами та замовленнями). Як ми бачимо, їм будуть потрібні однакові вхідні дані, тим більше, що бізнес може вибирати предикати для застосування. Усі дані надаються іншими мікросервісами, крім самого вмісту кошика. Збір даних сам по собі не є складним , але він стає складним, коли потрібно викликати ~ 10 інших мікросервісів та підтримувати структуру, яку очікує механізм правил.