Як ми розпилювали моноліт. Наш досвід переходу до мікросервісів

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

З розвитком Solidgate зростав і розвивався і наш основний сервіс процесингу Cardgate. З часом він перевалив за 110 тис. рядків коду — це спричинило низку негативних ефектів в роботі з ним. Через те, що це Kotlin + Spring + Hibernate, сервіс стартує дуже довго, крім цього — доводиться довго чекати виконання юніт-тестів локально (ініціалізацію перед самими тестами), а загальна тривалість CI/CD-процесу від коміту до проду перевалила за годину.

Говорячи мовою цифр, ось деякі тривалі процеси в нашому пайплайні: білд — 8 хвилини, юніти — 7 хвилин, функціональні тести — 15 хвилин, деплой — 7 хвилин. А все разом з іншими задачами в середньому відбувалось 80-90 хвилин.

Ще одна очевидна незручність — складність роботи з таким сервісом. Багато змін, багато інженерів, багато комітів. Масштабувати роботу неможливо, а з усім тим компанія розвивається — тож фічей потрібно все більше. Збільшення команди призводить до «штовхання ліктями» при виконанні та викатуванні своєї роботи.

Як результат — з’явились мерж-конфлікти, черги деплою як на прод, так і на тестове середовище для написання AQA тестів. Це призвело до того, що в день ми могли викатити в прод не більше трьох комітів (ми працюємо за методологією trunk based development та деплоїмо кожну таску атомарно).

І хоч ми, звісно, багато працювали над прискоренням CI/CD-процесу, додали кешування, оптимізували деякі джоби — покращити ситуацію вдалося лише скороченням процесу з 1,5 годин до 40 хвилин, але не вирішити повністю. Ми вперлися в обмеження великого моноліту. Саме тому найприродніший шлях розв’язання проблеми — це розпилювання цього моноліту на менші сервіси.

Основні складнощі

У нас велика, складна і навантажена система. Ми не можемо дозволити собі мейнтенанс. Хвилина зупинки нашого сервісу коштує компанії приблизно $10.000, а при виділенні частини функціональності з’являються стандартні проблеми, як-то: спільний доступ до баз даних, роути на балансерах, перемикання трафіку, перевірка коректної роботи тощо.

Для розв’язання цих проблем немає стандартного рішення або патерну. Тож сьогодні я розповім про два підходи, які ми використовували — хоч наш процес розпилу триває і досі.

Чому не переписати?

За свій досвід роботи я бачив дуже багато поривів переписування старих систем наново «як треба». Кожній команді хочеться створити ідеальний, новий сервіс без недоліків попереднього — і в один момент перейти на нього. І щоразу виявляється, що це так просто не працює.

Коли я працював в Інформаційних Судових Системах України, керував командою розробки діловодства для Господарських та Адміністративних судів. В цей час сусідня команда, де розробляли діловодство Загальних судів, вирішила переписати старий застосунок на новий. Вони були вимушені одночасно підтримувати чинну систему та «з нуля» будувати нову. Витратили на це кілька років.

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

Щось подібне було коли я працював на початку нульових з системою діловодства Головного Управління Архітектури та містобудування Києва. Але в цей раз процес переписування не завершився взагалі. Побудована нова система так і не змогла повноцінно замінити стару. З роками змінювались команди розробки, але (наскільки мені відомо) і досі працівники використовують обидві системи одночасно для різних задач.

Ще гірше було під час моєї роботи в 3Shape. Надійну, але дещо застарілу систему 3D моделювання, написану на Delphi, хотіли переписати на C#. Роки розробки «поруч» призвели до того, що від нової просто відмовились і продовжили роботу над існуючою.

Тому варіант переписування частини сервісу заново, а потім перемикання на цей новий сервіс — дуже ненадійний варіант.

А які ж є тоді способи зменшення ризиків переписування старої системи на нові рейки? Розглянемо далі.

Підміна ендпоінтів

Трохи розкажу про такий важливий патерн, як Strangler. Суть цього патерну — створити такий собі новий проксі-сервіс, який буде всі вхідні запити прокидувати в основний сервіс, а відповіді з основного сервісу віддавати назад. З часом обробка деяких запитів почне відбуватися на новому сервісі і відразу віддавати результат, не звертаючись до старого. Поступово новий візьме на себе всю обробку та залишить старий сервіс без роботи.

Цією стратегією ми скористалися для переносу нашої status page — сторінки про статус платежа для клієнта. Під час оплати для деяких транзакцій вимагається додаткова перевірка 3D Secure — у цих випадках ми редіректили користувача на окрему сторінку, функціональність якої була реалізована на старому сервісі. Наші кроки:

  1. Зробили проксі на старий за всіма запитами взагалі.
  2. На балансері переключили на новий сервіс роути типу/api/v1/status/ID/TOKEN, /api/v1/track-3ds-status/ID/TOKEN і такі інші.
  3. Реалізовували на боці нового сервісу обробку цих ендпоінтів поступово, спринт за спринтом.

Це дало нам кілька суттєвих переваг.

  • Функціональність не дублювалася в обох сервісах. Щойно ми завершили роботу над новою реалізацією певного запиту і переключалися на нього, стару можна було видаляти.
  • Ми мали результат вже і зараз. Щойно один ендпоінт був готовий, він йшов у прод і використовувався користувачами. Не треба було чекати завершення розробки всього нового сервісу.
  • Процес переписування проходив значно легше, тому що не потрібно було підтримувати дві системи одночасно. Відповідно — не потрібно вносити зміни в два місця.
  • Отримали можливість canary переливки трафіку. У новому сервісі за допомогою feature flag (тоглів) можна будь-який відсоток трафіку направляти в старий сервіс, а решту опрацьовувати в новому.
  • Можливість швидко відкатити все і переключити трафік на старий сервіс.

Коли вся система стабільно пропрацювала деякий час вже на 100% трафіку, а проблеми перестали з’являтись, ми створили останню задачу: чистка старого і нового сервісів від непотрібного коду.

Це дуже зручний патерн декомпозиції, але є випадки, коли його використання неможливе. Наприклад, у ситуації, коли ми виносили роутинг в окремий сервіс із сервісу процесингу.

Дублювання викликів

Частину платежів ми процесимо самостійно. Але в світі є регіони, де онлайн-платежі відбуваються за особливими правилами. Відтак, щоб отримати максимальну конверсію платежів, краще використовувати локальні платіжні системи (наприклад, Boleto у Латинській Америці, Razorpay у Індії чи mpessa в Африці). А тому ми інтегровані з кількома десятками інших систем у всьому світі. Яку з них використовувати в кожному конкретному випадку — вирішує наш сервіс роутингу.

Ми аналізуємо, в якій країні знаходиться користувач, магазин, банк, що випустив картку, у якій валюті й ще десятки інших параметрів. На основі цих даних ми ухвалюємо рішення про те, як саме і через яку систему найкраще провести платіж, аби забезпечити максимальну конверсію. Наприклад, для США ми використаємо TSYS, а для Європи — Adyen або Checkout.

Якщо ми все ж таки отримали відмову в платежі, наша система вміє використовувати каскади для нової спроби через іншу систему. Таким чином, поки користувач на сайті натиснув кнопку «сплатити» і чекає завершення транзакції, ми під капотом вирішуємо, який банк оптимальніше всього обрати заради досягнення максимальної конверсії. А якщо платіж впав — ми проводимо оплату на іншому банку.

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

Тому ми пішли іншим шляхом.

  • Всю логіку пошуку роутів ізолювали в коді, щоб виклик першого і наступного кроку каскаду зводився до одного місця.
  • Реалізували в новому сервісі аналогічну логіку пошуку (при цьому використовуючи прямий конект до бази старого сервіса). Тобто в новому сервісі у нас з’явилось два ендпоінти getFirstStep та getNextStep.
  • Ми мали переконатись, що новий сервіс працює без помилок, а для цього можна проводити його тестування. Або...

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

Ми вивели повідомлення — чи збігаються результати та наскільки альтернативний пошук (через новий сервіс) повільніше існуючого. Через це можна було підключити новий сервіс, що гарантовано не впливало на работу всього процесингу, але при цьому бачити, як працює новий та чи співпадають його розрахунки з існуючим. Щоб не сповільнити опрацювання платежів, виклики ми робили в горутинах.

  • Після тижня роботи обох роутингів і їхнього порівняння (авжеж були фікси багів), ми почали переключати частину платежів на результати нового роутингу. Так впродовж кількох днів все обчислення роутингу вже відбувалося за допомогою нового сервісу. Стара логіка працювала паралельно, але лише для контролю однаковості результатів.
  • Наостанок, ми видалили в старому сервісі всі виклики старої логіки та її реалізацію.

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

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

Висновки

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

Обидва підходи дають можливість роботи одночасно обох версій сервісів. А це дозволяє:

  • поступово переключати трафік;
  • порівнювати результати роботи обох версій;
  • швидко повернутись до попередньої версії.

Також варто не обмежуватися лише стратегією розробки та не забувати про стратегії релізів (canary/blue-green), щоб зменшити вплив на трафік, інвестування у моніторинг системи, процеси реагування (SRE), тощо.

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

👍ПодобаєтьсяСподобалось22
До обраногоВ обраному7
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

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

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

Щодо статті — мені відчувається дисонанс заголовку (тягне на велику кількість структурованого контенту) і контент (тягне на опис пари підходів до специфічної проблеми).

У мене в команді 9 сервісів на 7 інженерів. Деякі з них чисті мікросервіси які мають дуже маленьку кодову базу і міняються вкрай рідко. Інші міняються часто. Сервіси які переростають з мікросервісу в макросервіс більш схильні накопичувати гівнокод. І велика частина в моноліті іншої команди (з історичних причин). Частину сервісів вже хочеться викинути і переписати код заново, але це непросто поєднувати зі швидкістю імпелементації фіч і комплаєнсом вимог різних стейкхолдерів. Звісно багато проблем в кодовій базі, але всі виправити нереально. Тому підходи описані в статті застосовуються і допомагають.

У меня всего 2 маленьких вопроса:
1. Какое общее число микросервисов?
2. Сколько человек работает в каждом микросервисе?

1. В компанії дофіга. В нашій команді близько 10.
2. 5 працюють з мікросервісами і їм супер комфортно і ще 4 з монолітом і їм супер незручно

5 працюють з мікросервісами

Круто. 5 человек на микросервис это как раз очень близко к максимально эффективному числу людей на кусок домена.

И что вы на выходе получили, дистрибьютед монолит? И у вас сервисы в одну базу ходят это антипаттерн микросервисов. Оказывается процесс распиливания монолита на жестко зависимы друг от друга сервисы это уже «паттерн» Strangler :D

Оказывается процесс распиливания монолита на жестко зависимы друг от друга сервисы это уже “паттерн” Strangler :D

Да.
Understand the outcomes you want to achieve
Decide how to break the problem up into smaller parts
Successfully deliver the parts
Change the organization to allow this to happen on an ongoing basis
martinfowler.com/...​anglerFigApplication.html

Они бюджет распилили, есть такой паттерн, очень калорийно

Розпилювання бюджету — це якраз прийти подивитись на існуючий софт, виказати своє «фе», сказати, що всьо треба перероблювати заново і окремою командою почати будувати щось нове поруч. Заробити грошенят років так 2-3 і звалити так нічого і не досягнувши корисного для компанії. В найкращому випадку зробити щось негірше існуючого )

Переход на новую архитектуру — всегда риск, особенно без четкой изоляции сервисов и ясной цели. В итоге можно получить распределённый монолит с высокой сложностью и затратами на поддержку. Вместо повышения гибкости появляется рост зависимостей и усложнение управления. Иногда лучше стабилизировать текущее решение, чем идти на кардинальные изменения без гарантированной выгоды.

с таким подходом можно называть функцию ввиде простыни из 10K строк тоже «паттерном» с умным лицом

Мабуть неуважно читали )
Так, в якийсь момент дійсно обидва сервіси дивляться в одну базу. Це невідворотній тимчасовий перехідний етап. Потім робиться ізоляція даних (перенесення потрібних таблиць до бази нового сервісу). Тут є також кілька різних способів від реплікації до стрімінгу, але то вже аут оф скоуп статті.
В результаті будуть 2 різних сервіса кожний зі своїми ізольованими даними

Сколько сервисов на БД в итоге после миграции и вывода из эксплуатации замещаемого монолита?

питання щодо збільшення кількості конфліктів на мердж реквестах:
у вас на одному умовному девелоп оточенні скільки зазвичай сидить девелоперів?..
5-10-15+ ?..
можливо, вам би допомогла методика розділення деву на дроплети?

Це складне питання, тому що щоб відповісти треба надати дуже багато контексту. Якщо коротко, то в нас всього три оточення (dev/pre-prod/prod) з якими працює вся компанія. Розламаний моноліт нашої команди на одному з оточень заафектить інші команди також. Через тривалий процес ci/cd виправити цю проблему швидко — неможливо.
Через певні особливості нашої інфраструктури, ми не можемо йти у збільшення кількості оточень, тим паче динамічне (принаймні поки що).
Про дроплети думали також, але впираємось у асинхронну взаємодію. Дуже багато тестів на це зв’язано і роутити меседжи черг на певні інстанси складно. Але також копаємо в цьому напрямку

Рекомендую спробувати, особливо коли ви поступово замінюєте функціонал на роутах. В мене є досить позитивний досвід такої роботи, ділюсь:
Ось, наприклад є у вас загальний дев на dev.your.env й там же бази для розробки,
створюєте впс-ку на мінімалках, прописуєте її як droplet1.dev.your.env, й цей дроплет також дивиться на бази оточення dev.your.env ;
на ній працюють 2-3 девелопера що пілять фічу, роблять свої коміти;
коли робота готова для тестування на деві, робоча гілка фічі сквошиться в один коміт, для зручності;
з свіжого дева робиться нова гілка й туди черрі пікається той єдиний коміт, після чого робиться мердж реквест цієї гілки.
Така методика мінімізує конфлікти на мержах в рази.

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

droplet1.dev.your.env

Платіжна система є доменом, який, м’яко кажучи, не дуже толерантен до САР -проблеми\теореми. Як ви це подолали? Скільки тепер у вас реляційних баз даних після декомпозиції? Чи всі мікросервіси «дивляться» в єдину (головну) БД?
Чи задіяли Cassandra?

Це правда. Я там писав, що дані ми також ізолюємо і виносимо в окремі бази. У кожного сервіса своя база. І за це дійсно потрібно платити. Десь переходом на апі запити, десь на кеш, десь на стрімінг і збереження (копіювання) всього до своєї бази. Але ця реліабіліті — то вже інша тема для іншої статті )

Мотивація розпилювання моноліту була наступна (я нічого не упустив ?)

Збільшення команди призводить до «штовхання ліктями» при виконанні та викатуванні своєї роботи.

Як результат — з’явились мерж-конфлікти, черги деплою як на прод, так і на тестове середовище для написання AQA тестів. Це призвело до того, що в день ми могли викатити в прод не більше трьох комітів (ми працюємо за методологією trunk based development та деплоїмо кожну таску атомарно).

І хоч ми, звісно, багато працювали над прискоренням CI/CD-процесу, додали кешування, оптимізували деякі джоби — покращити ситуацію вдалося лише скороченням процесу з 1,5 годин до 40 хвилин, але не вирішити повністю. Ми вперлися в обмеження великого моноліту. Саме тому найприродніший шлях розв’язання проблеми — це розпилювання цього моноліту на менші сервіси.

Тобто, мотивація\проблема полягала чисто в структурі проекту, а не в бізнесі?

Далі, в описі декомпозиції моноліта, я не побачив дещо, наприклад, орієнтацію на модуляризацію навколо business capabilities. Це дизайниться ДО розпилювання.

Описаний патерн декомпозиції моноліта я б назвав «расчленьонка».
На виході ви отримали distributed monolith ?

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

Вам було б цікаво поговорити про аналіз вихідного коду та датамаскінг? Чи використовуєте такі сервіси? Чи бачите для себе в цьому потребу?

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

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

Про біль монолітів і загальні рекомендації написано вже 100500 топіків.

Про біль «мікросервісів» теж.
Здається ще у 2018ому нашуміла стаття:
«Кінець мікросервісного безумства».

Всюди біль, всюди щось муляє :)

Була б вдячна, як би ви поділилися посиланням на статтю. Дякую!

100К рядків це ще не біль. Це середненький за розміром проект, і дуже спірно чи варто таке взагалі ділити.

мене теж душать сумніви. Є верогідність, що там стане може й трохи менше проблем, але з’являться нові, іншого штибу.

І вони з’явилися. Тут в коментарях вже є про CAP. Також ще реліабіліті, транзакційність, обзервабіліті і т.д.. Але це не проблеми, а задачі, які ми успішно вирішуємо

Я б не став, якби один інженер заглядав туди і щось фіксав раз на тиждень. Але коли п’ятеро щодня деплоять кілька фіч, то вже очевидно, що пора)

цікава стаття, дякую! нові сервіси також на Spring + Hibernate? наче щось про горутини згадали

Сорі. Це помилка друку. Там малося на увазі «Корутини», а не «Горутини». А сервіси виносимо як на Го так і на Котлін. В залежності від задач сервіса підбираємо потрібний інструмент

У нас проект теж платіжний процессор, і проблеми схожі з вашими — треба було об’єднатися — навіщо робити два платіжних процессора :DD хоча мабуть ніші різні

Давайте об’єднаємо зусилля. Пишіть в особисті. Ми постійно наймаємо ;)

Трохи розкажу про такий важливий патерн, як Strangler.

Не в критику просто іронічно як розкидування ендпойнтів почали називати всяко модно й мікросервісно, api gateway, strangler

До того як це все почали обзивати усякими модними словами це звалось mod_proxy :)

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

А як у вас там з дізастер рекавері теж?

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

Оверхед звісно є, але він мінімальний через те, що в нас CI/CD процеси автоматизовані і створення нового сервісу потребує мінімум інфраструктурних рухів. Також зберігаємо баланс розміру цих сервісів (відносно величезного моноліту вони звісно мікро, але і не такі, щоб на одну функцію). Коротше користі значно більше ніж оверхеду.

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

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

Так деплой став ізольований для окремого сервісу, який займає значно менше часу ніж моноліт. От команда мікросервіса може частіше релізити без завʼязки на моноліт. Історія в гіті не змішана з іншими частинами моноліту — полегшує контроль над вибіркою фіч для релізу.

Тільки ви не перейшли на мікросервіси, згідно опису в статті, і ваших коментарів :)

Це звичайна історія — з моноліта відокремлюється деякий функціонал у окремий сервіс.
Класичний випадок окремого сервісу ще у 0ві:
«Генерація і розсилка ордерів у pdf, xls, csv — в залежності від налаштувань кастомера»

Моноліти давно «не існують» — зазвичай це один, два жирнючих сервіси, і з півдесятка середньго розміру.
Ну от, ви виявили свій «сервіс генерації pdf» і винесли його з головного сервісу в окремий.

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

Цікаво, який у вас розмір технічної команди, скільки розробників? Хтось працює над розпилом, в хтось далі деліверить нові фічі для продукту на моноліті?

Прямо зараз 9 інженерів. Така велика кількість через те, що готуємось до ділення на дві команди, тому і набираємо кількісну вагу.
Це, доречі, також позитивний сайдефект розпилювання. В нас з’явилася змога поділитися на команди, що працюватимуть над різними сервісами.
По задачам нічого не змінилося. Просто чергова таска в спринті «створити ендпоінт», потім «заюзати ендпоінт», потім «видалити стару логіку» і так далі. Хтось ці таски бере і робить. А паралельно несуться нові фічі.

А немає такого, що між

«заюзати ендпоінт», потім "видалити стару логіку

проходить 6+ місяців? Так як команди (кліенти) займаються своїми справами і не дуже хочуть витрачати час на міграцію.

Як ми розпилювали моноліт. Наш досвід переходу до мікросервісів
Ще не перейшли.

*suspicious_fry.jpg*

От команда мікросервіса може частіше релізити без завʼязки на моноліт

Будемо чесними, частіші релізи мікросервіса не завжди потрібні. Якщо це дійсно мікро сервіс :)

Бо часто буває, що ці зміни можуть повпливати і на інші сервіси.

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

працює 5 інженерів і я ще шукаю одного.

Вибачте, а на чому написаний backend?

На Го і на Котлін. В залежності від задач сервіса підбираємо потрібний інструмент

А моноліт «був» теж на Го і на Котлін?

Не в критику просто іронічно як розкидування ендпойнтів почали називати всяко модно й мікросервісно, api gateway, strangler

Щоб потім на співбесіді спитати які патерни ви знаєте.
Проксі — це взагалі структурний патерн по гофу, тому ми вам передзвонимо 😁
А якщо серйозно, то шукати статті на цю тему по ключовому слову легше.

strangler

!= використання проксі ( у всіх значеннях цього слова)

Підписатись на коментарі