Strangler Fig — поступова підміна, не big-bang rewrite
Strangler Fig pattern дозволяє новому фрагменту поступово перехоплювати частину поведінки навколо legacy-системи. Старий і новий paths певний час coexist, а кожен крок має явну boundary, routing rule, ownership, verification і rollback.
Назва pattern не виправдовує приховану міграцію. Якщо немає способу зрозуміти, який path виконався, або rollback залишає подвійні записи, це не контрольована strangler slice.
Мінімальна модель strangler slice
| Частина | Питання |
|---|---|
| Boundary | Який конкретний фрагмент behavior підмінюється? |
| Router | За якою стабільною умовою обирається legacy або new path? |
| Coexistence | Як paths поводяться поруч без подвійних side effects? |
| Evidence | Як побачити path, output, помилку та міграційний стан? |
| Rollback | Як вимкнути new path і повернутися без втрати даних? |
| Exit | Коли legacy fragment можна видалити? |
Етапи підміни
- Зафіксуйте current behavior і seam для одного fragment.
- Додайте нову реалізацію за наявним контрактом, не розширюючи scope.
- Визначте routing або feature boundary з явною default поведінкою.
- Перевірте old і new path на однакових representative inputs.
- Спостерігайте discrepancy, error rate та side effects до розширення охоплення.
- Поступово збільшуйте slice лише після risk gate.
- Видаляйте legacy code тільки після exit criteria та підтвердженого rollback window.
Небезпеки coexistence
- два paths записують один ресурс або відправляють два notifications;
- новий path має іншу timezone, rounding, retry або idempotency semantics;
- routing rule залежить від неперевіреного flag або configuration precedence;
- rollback перемикає код, але не повертає вже змінений state;
- legacy path продовжує отримувати traffic, але його більше ніхто не спостерігає.
Strangler slice record
# STRANGLER_SLICE.md
## Fragment and boundary
## Legacy path
## New path
## Routing rule
## Coexistence and side effects
## Verification evidence
## Rollback procedure
## Exit criteria
## Owner and open risks Канонічне джерело уроку · JavaRush
Відкрити матеріал JavaRush