Вибір сервісно-орієнтованої архітектури для застосунку дає чимало переваг: легка підтримка, стійкість, швидкість розробки та адаптивність системи до змін. Водночас її побудова повʼязана із низкою викликів та потенційних проблем, вирішити які може правильний оркестратор. Сай Прагна Етікайла, Tech Lead в Twilio, поділилася досвідом роботи з асинхронними архітектурами. На конференції Software Architecture fwdays'23, що відбулася у вересні в офісі Genesis, вона розповіла, як побудувати систему, яка працюватиме безперебійно, її можна буде масштабувати та додавати нові фічі або процеси без надзусиль.
Що таке сервісно-орієнтована архітектура
Сервісно-орієнтована архітектура (SOA, service-oriented architecture) — це популярний архітектурний шаблон для створення програмних застосунків на основі окремих модулів. Асинхронною називають SOA, в якій кожен сервіс є автономним і виконує окреме завдання. Якщо синхронна система надсилає запит і чекає негайної відповіді, то в цьому дизайні комунікація між сервісами цього не потребує. Це означає, що клієнт може надіслати запит і перейти до інших завдань, не чекаючи відповіді.
Візьмемо до прикладу застосунок із доставки їжі. Після розміщення замовлення клієнту не потрібно чекати, поки ресторан приготує їжу, щоби продовжити користуватися застосунком. Він може вивчати меню чи робити замовлення в інших ресторанах. Коли його замовлення буде готовим або доставленим, він отримає сповіщення. Можливість надсилати запит і отримувати відповідь у невизначений час відображається в асинхронній SOA.
Виклики побудови асинхронної SOA
Створення асинхронних сервісно-орієнтованих архітектур повʼязано із низкою потенційних проблем.
Управління станом
У вищезгаданому прикладі команді буде складно підтримувати та керувати станом кожного окремого процесу. Після того, як користувач розмістив замовлення, воно проходить різні стадії: підтверджується, готується, а потім доставляється. Кожен із цих етапів є незалежною подією, деякі відбуваються одночасно з іншими. Тому точне керування станом кожної події в цих розрізнених процесах — виклик. Уявіть, що програма доставки показує, що замовлення тільки підтверджено, а насправді воно вже готове до відправки. Це може призвести до плутанини та потенційного невдоволення клієнта.
На зображенні нижче — приклад того, як може виглядати архітектура такої керованої подіями (event-driven) системи. Щоразу, коли відбувається подія, вона запускатиме нову операцію. Тож, по суті, замість послідовності кроків, система виконує окремо події X, Y та Z, насправді не розуміючи послідовності етапів, які відбуваються в системі доставки їжі.
Відмовостійкість
Якщо під час замовлення їжі платіж було відхилено, або ресторан не отримав сповіщення про замовлення, це може спричинити зупинку всього процесу. Отже, важливо подбати про механізми ефективної обробки помилок, які зроблять систему більш відмовостійкою. Наприклад, система може повторити невдалу операцію або сповістити користувача про проблему та запропонувати повернутися на крок назад.
Трасування та моніторинг системи
У системі доставки їжі, скажімо, Uber Eats, залучено багато частин, наприклад застосунок для клієнтів, ресторанні системи, застосунок партнерів з доставки та серверні служби. Коли справа доходить до відстеження певного процесу або вузьких місць у продуктивності, це схоже на пошук голки у стозі сіна.
Наприклад, клієнт повідомив, що не отримав свою їжу, хоча програма показує, що вона доставлена. Без належного відстеження неможливо визначити, де процес пішов не так — під час приготування їжі в ресторані чи транспортування кур’єром? Можливість якісного моніторингу системи має вирішальне значення для швидкого виявлення проблем.
Ремонтопридатність
Асинхронні системи за своєю природою є складними. Оскільки вони розвиваються та масштабуються, з часом їхня складність лише зростає. Припустимо, ви хочете додати функцію пріоритетної доставки для преміумклієнтів. Якщо система спроєктована погано, це може вплинути на численні компоненти та служби й потребуватиме численних доопрацювань. Завдання ремонтопридатності полягає в тому, щоби забезпечити можливість легкої модифікації, розширення та масштабування систем без збоїв у роботі та надмірних зусиль.
Щоб уникнути всіх перелічених проблем та забезпечити легке масштабування асинхронних систем, команди використовують системи оркестрації.
Як оркестрація розв'язує проблеми асинхронної SOA
Оркестратори — потужні інструменти, які впорядковують асинхронні системи й забезпечують їхню ефективність, надійність і масштабованість. Вони діють як центральні координатори, які керують усіма процесами. Подібно до диригента в оркестрі, вони забезпечують виконання завдання у відповідний час і в правильній послідовності.
Розберемо, як оркестратори допомагають подолати вищезазначені проблеми.
Відстеження станів та керування послідовністю
У наведеному вище прикладі архітектури ми побачили, що система не розуміє справжньої послідовності етапів замовлення, приготування та доставки їжі. Таким чином, у граничному випадку події можуть виконуватися не в тому порядку, якого очікуємо. Це відбувається, коли кінцевий автомат (State Machine) отримує подію, в якій, наприклад, база даних перебуває в стані A, а не в стані Y. Він не знатиме, як з цим впоратися, і просто ігноруватиме її. Обробки подій вручну несуть величезні витрати на розробку, адже щоби внести зміни в один конкретний стан, вам потрібно знати всю базу коду, переглянути всю послідовність, щоби зрозуміти, що граничні випадки враховані.
Оркестратори використовують попередньо визначені робочі процеси або послідовність завдань, які відповідають різним етапам доставки. Механізм визначає порядок, у якому має виконуватися завдання, а також будь-які залежності чи умови між ними. Підтримуючи цей організований потік станів, оркестратори усувають хаос і будь-які потенційні невідповідності в переходах між станами. Вони також гарантують, що всі сторони, від внутрішніх команд до користувачів матимуть точну та своєчасну інформацію про статус замовлення.
Якщо на попередньому графіку ми бачили систему, повністю керовану подіями, то тепер оркестратори дбають про послідовність усіх подій.
Автоматична обробка помилок та підвищення відмовостійкості
Оркестратори мають вбудовані механізми, які обробляють помилки та підвищують надійність системи. Наприклад, якщо під час замовлення виникає помилка з платежем, інструмент автоматично повторює невдалу операцію або застосує стратегію резервного копіювання, щоби дати системі час для розв'язання проблеми. Це дозволяє їй працювати безперебійно у разі виникнення неочікуваних помилок.
Ви можете задати необхідну конфігурацію — вказати кількість спроб чи час очікування відповіді системи. Наприклад, якщо клієнт замовив піцу, а його платіжна система не відповідала протягом двох годин, немає сенсу продовжувати замовлення.
Широкі можливості моніторингу системи
Інструменти оркестрації дозволяють налаштувати моніторинг складних асинхронних систем, щоби кожен процес був видимим та простежуваним. У такий спосіб команді значно легше виявляти вузькі місця та усувати проблеми. На прикладі з доставкою їжі завдяки оркестраторам ви можете відстежувати, скільки замовлень було відкрито та обробляється в поточний момент.
Полегшення ремонтопридатності та адаптивності
Одним із завдань підтримки асинхронних систем є внесення змін або додавання нових фічей без порушення роботи всієї системи. Оркестратори надають чіткі та засновані на коді флоу, які дозволяють швидко збирати базову інфраструктуру проєкту. Це полегшує розуміння та модифікацію системи, дозволяє швидко вносити зміни або запроваджувати нові фічі, а сама система може розвиватися та адаптуватися до нових вимог.
Розширення продуктивності розробки
Абстрагуючи складність асинхронних систем, оркестратори забезпечують високорівневу модель програмування. Так розробники можуть зосередитися на бізнес-логіці та основних функціональностях програм, які насправді приносять цінність, а не потопають через проблеми інфраструктури. Все це прискорює процес розробки та скорочує час виходу на ринок.
Керування станом, моніторинг, відмовостійкість, зменшення видатків та можливість швидко додавати нові фічі, про які ми говорили вище, — все це оркестратори забезпечують «з коробки».
Інструменти для оркестрації
Існує багато систем оркестрації, кожна з яких має унікальні функції та переваги. Деякі з них мають відкритий вихідний код, інші — open-source з керованими рішеннями, деякі — закритий вихідний код. Розглянемо найпопулярніші з них.
Apache Airflow. Популярний гнучкий оркестратор із відкритим кодом, у якому задачі та їхній порядок описуються з допомогою Python. Apache Airflow підходить для завдань дата-інжинірингу, конвеєра даних та сценаріїв, де кроки робочих процесів можуть часто змінюватися. Інструмент має активну спільноту та широку підтримку плагінів.
Argo. Нативний оркестратор від Kubernetes, який було розроблено для хмарних середовищ. Argo використовує потужність K8s для керування робочими процесами та забезпечення їхньої гнучкості та відмовостійкості. Кожен крок у робочому процесі Argo розглядається як контейнер. Цей інструмент підходить командам, які вже використовують Kubernetes і потребують масштабування.
Temporal. Простий та надійний оркестратор з відкритим кодом. Існує декілька SDK для цього інструменту: ви можете описати свій робочий процес як код на Java, .NET, Go чи PHP. Такий підхід корисний, якщо у вас є складна бізнес-логіка, яка має багато розгалужень. Наприклад, в службі доставки їжі можна описати таку функцію: якщо кур’єр повідомляє про поломку автомобіля, треба негайно скасувати замовлення, повідомити про це клієнта та повернути йому гроші. Temporal має вбудовану обробку відмов й переривання, чудово керує робочими процесами зі збереженням стану, пропонує керований хмарний сервіс.
AWS Step Functions. Повністю керований оркестратор, який надають Amazon Web Services. Він спрощує оркестрування складних багатоетапних програм за допомогою візуальних робочих процесів. У цьому інструменті вони визначені не як код, а за допомогою кінцевого автомата Amazon (The Amazon States Language). Step Functions легко інтегрується з іншими службами AWS, пропонує відмовостійкість і простоту використання, що дозволить розробникам створювати надійні та масштабовані програми.
Отже, обираючи оркестратор робочого процесу, враховуйте такі фактори, як складність завдань, вимоги до масштабованості, інтеграцію з наявною інфраструктурою та зручність програмування. Кожен інструмент пропонує унікальні функції та переваги, але зрештою усі вони дозволяють розробникам створювати стійкі, масштабовані та підтримувані програми.