Наш Процес Що ми будуємо Наша Команда Блог Контакти
Послуги Кастомне ПЗ SaaS-розробка AI та автоматизація MVP для стартапів Веб та мобільні застосунки Хмара та DevOps QA та тестуванняМодернізація LegacyАутсорсинг розробкиЗахист ланцюга поставок Лендінги та бізнес-сайти IT Калькулятор вартості SaaS КалькуляторКонструктор AI-агентаГід по вартості SaaS Розпочати проєкт →
Головна Блог Патерн Strangler Fig
Модернізація Legacy

Модернізація legacy-систем без переписування з нуля: пояснюємо патерн Strangler Fig

Повне переписування критично важливих для бізнесу систем провалюється частіше, ніж вдається. Ось інкрементальна альтернатива, яка дозволяє модернізувати legacy-систему, поки вона продовжує обслуговувати бізнес.

Чому «велике переписування» постійно провалюється

Коли legacy-система стає нестерпною, перший інстинкт — заморозити роботу над фічами, переписати все правильно з нуля, а потім перемкнутися. Це зрозумілий інстинкт, і він постійно призводить до провалу з одних і тих самих причин: переписування займає значно більше часу, ніж планувалося, бо крайні випадки старої системи ніде не задокументовані, окрім самого коду; бізнес насправді не може на рік заморозити запити на нові фічі, поки інженери переписують систему; а сам момент перемикання — це одна подія з високими ставками, коли всі приховані відмінності між старою та новою системою одночасно перетворюються на продакшн-інциденти.

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

Що таке патерн Strangler Fig насправді

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

Головна ідея одним реченням

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

Як це відбувається насправді, етап за етапом

Нуль
Запланованого простою — система обслуговує трафік на кожному етапі
По маршруту
Гранулярність відкату — невдала міграція зачіпає один зріз, а не все одразу
Безперервна
Поставка бізнес-цінності — без багатоквартального заморожування фіч на час процесу

Де команди помиляються

Дві помилки пояснюють більшість зупинених проєктів зі Strangler Fig. Перша — пропустити етап мапування і мігрувати те, що здається найпростішим, що зазвичай означає виявлення критичної незадокументованої поведінки вже на третій частині в продакшені, а не на другій. Друга — ставитися до маршрутизаційного шару як до тимчасового хаку, а не як до справжньої інфраструктури: він потребує такого ж моніторингу, тестування та чергувань on-call, як і будь-яка інша частина шляху запиту, бо на час міграції він і є цим шляхом запиту.

Є legacy-система, яку ніхто не хоче чіпати?

Ми змапуємо, що вона насправді робить — а не те, що написано в документації, — перш ніж щось пропонувати.

Поговорити про вашу legacy-систему →

Поширені запитання

Скільки часу займає міграція за патерном Strangler Fig порівняно з переписуванням?

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

Чи працює це для системи без тестів і без документації?

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

А якщо реальна проблема — це схема бази даних legacy-системи?

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

Цей патерн підходить лише для великих корпоративних систем?

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

HS
Автор: інженерна команда Hardened Soft
Ми пишемо про рішення, які приймаємо в реальних клієнтських проєктах — компроміси у витратах, архітектурні патерни та ті частини розробки, які не потрапляють у презентацію для продажу.