Итерационный подход
в борьбе с легаси
Алексей Коротин
Тимлид команды «Платформа»
Slide 2
Slide 2 text
SuperJob — это:
10 млн
пользователей
в месяц
более
30 млн
резюме
1.5 млн
пользователей
в сутки
2
Slide 3
Slide 3 text
Легаси в коде
● API
● Версионирование
● Борьба с легаси
О чём поговорим
3
Slide 4
Slide 4 text
Легаси в коде
● API
● Версионирование
● Борьба с легаси
О чём поговорим
4
Легаси в данных
● В БД
● В кэше
Slide 5
Slide 5 text
Что такое легаси в коде?
5
Slide 6
Slide 6 text
«Легаси — это код без тестов»
M. Feathers, Working Effectively with Legacy Code
«Легаси — это код без поддержки»
Wikipedia
«Код становится легаси сразу»
A. Hunt, D. Thomas, The Pragmatic Programmer
6
Slide 7
Slide 7 text
Монолит API-based app
7
Slide 8
Slide 8 text
Монолит
Много
кода
Мало
тестов
8
Slide 9
Slide 9 text
● Переписать всё с нуля: дорого и долго
Что делать?
9
Slide 10
Slide 10 text
● Переписать всё с нуля: дорого и долго
● Покрыть всё тестами: лишняя работа
Что делать?
10
Slide 11
Slide 11 text
Middleware
11
Slide 12
Slide 12 text
Applicant
Legacy service 1
Legacy service 2
API
Application
Resume
...
Vacancy
Middleware
12
Slide 13
Slide 13 text
JSON:API
Applicant.php
Resume.php
Vacancy.php
applicant
resume
vacancy
Code API
13
Slide 14
Slide 14 text
GET /applicant//
14
Slide 15
Slide 15 text
GET /applicant//
Legacy service
15
Slide 16
Slide 16 text
Test 1
Test 2
Test 3
GET /applicant//
Legacy service
16
Slide 17
Slide 17 text
Test 1
Test 2
Test 3
New service
Legacy service GET /applicant//
17
Slide 18
Slide 18 text
А здесь происходит
нечто зловещее
Метод возвращает
нужную нам модель
18
Slide 19
Slide 19 text
19
Slide 20
Slide 20 text
Наш будущий экшн
Ограничиваем доступ
20
Slide 21
Slide 21 text
Id из роута
Передаём результат
работы сервиса в
middleware
21
Slide 22
Slide 22 text
Версионирование
22
Slide 23
Slide 23 text
Версионирование через фичи
Feature A
Feature B
Feature C
Server Client
Feature D
Feature C
Feature E
Feature D
Feature F
23
Slide 24
Slide 24 text
Версионирование через фичи
Feature A
Feature B
Feature C
Server Client
Feature E
Feature F
Feature C
Feature D
Feature D
24
Slide 25
Slide 25 text
Версионирование через Git
v1.0
v1.1
Git tags Server
v2.0
v1.0
v1.1
v2.0
25
Slide 26
Slide 26 text
Версионирование через боль
или конструкции языка
26
Slide 27
Slide 27 text
Наш выбор
Ёж Уж
(вроде)
+
27
Slide 28
Slide 28 text
Наш выбор
+
Циферки Фичи
28
Slide 29
Slide 29 text
Основные принципы
Меняются сущности Версионируем конфиг
29
Версионируемая логика изолирована
и легко ищется
40
Slide 41
Slide 41 text
Профиты подхода
● Меньше кода: всё в конфигах
41
Slide 42
Slide 42 text
Профиты подхода
● Меньше кода: всё в конфигах
● Легко искать ненужное: код обёрнут фичами
42
Slide 43
Slide 43 text
Профиты подхода
● Меньше кода: всё в конфигах
● Легко искать ненужное: код обёрнут фичами
● Меньше рефакторить: можем удалять старый код
43
Slide 44
Slide 44 text
Легаси в БД
44
Slide 45
Slide 45 text
потеряли
45
Slide 46
Slide 46 text
Подозрительные таблицы
● Давно не менялись
46
Slide 47
Slide 47 text
Подозрительные таблицы
● Давно не менялись
● Давно не читались
47
Slide 48
Slide 48 text
Подозрительные таблицы
● Давно не менялись
● Давно не читались
● Таблица большая
48
Slide 49
Slide 49 text
Размер таблицы
INFORMATION_SCHEMA
TABLES
DATA_LENGTH
INDEX_LENGTH
Сумма этих колонок даст
примерный размер таблицы
InnoDB
49
Slide 50
Slide 50 text
MySQL: PERFORMANCE_SCHEMA
PERFORMANCE_SCHEMA
table_io_waits_summary_by_table
COUNT_READ
COUNT_WRITE
Количество чтений из таблицы
Количество изменений таблицы
(INSERT + UPDATE + DELETE)
50
MySQL (5.7+): sys schema
sys
schema_table_statistics
rows_fetched
rows_inserted
Такое название хотя бы можно
запомнить (нет)
rows_updated
rows_deleted
54
Slide 55
Slide 55 text
Percona/MariaDB: плагин userstat
my.cnf: Runtime:
или
55