Slide 1

Slide 1 text

Итерационный подход в борьбе с легаси Алексей Коротин Тимлид команды «Платформа»

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

Slide 30

Slide 30 text

Основные принципы Меняются сущности Версионируем конфиг Меняются эндпоинты Версионируем роуты 30

Slide 31

Slide 31 text

Основные принципы Меняются сущности Версионируем конфиг Меняются эндпоинты Версионируем роуты Меняется логика Используем фичи 31

Slide 32

Slide 32 text

Структура конфигов config mapping routes.php applicant.yml ... Роуты API Маппинг для сущностей 32

Slide 33

Slide 33 text

Структура конфигов config mapping routes.php applicant.yml config 1.0 endpoints config.yml mapping applicant.yml 2.0 3.0 33

Slide 34

Slide 34 text

Структура конфигов config mapping routes.php applicant.yml config 1.0 endpoints config.yml mapping applicant.yml 2.0 3.0 34

Slide 35

Slide 35 text

Структура конфигов config 1.0 endpoints config.yml mapping applicant.yml 2.0 3.0 config mapping routes.php applicant.yml 35

Slide 36

Slide 36 text

36

Slide 37

Slide 37 text

37

Slide 38

Slide 38 text

Добавляем фичу в enum 38

Slide 39

Slide 39 text

Новая версия Активируем фичу 39

Slide 40

Slide 40 text

Версионируемая логика изолирована и легко ищется 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

Slide 51

Slide 51 text

TrackTableTimestampsCommand.php 51

Slide 52

Slide 52 text

table_io_waits_summary_by_table TrackTableTimestampsCommand.php 52

Slide 53

Slide 53 text

table_io_waits_summary_by_table table_timestamps TrackTableTimestampsCommand.php 53

Slide 54

Slide 54 text

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

Slide 56

Slide 56 text

Percona/MariaDB: плагин userstat INFORMATION_SCHEMA TABLE_STATISTICS ROWS_READ ROWS_CHANGED Таблица создаётся плагином Не PERFORMANCE_SCHEMA 56

Slide 57

Slide 57 text

Пример отчёта по таблицам 57

Slide 58

Slide 58 text

Пример отчёта по таблицам Логи постоянно пишутся, но читаются только при необходимости 58

Slide 59

Slide 59 text

Пример отчёта по таблицам Выглядит, как не до конца спиленная фича 59

Slide 60

Slide 60 text

Легаси в кэше? 60

Slide 61

Slide 61 text

Подозрительные кэши ● В кэш пишут, но не читают 61

Slide 62

Slide 62 text

Подозрительные кэши ● В кэш пишут, но не читают ● Кэш пытаются удалить, но не пишут 62

Slide 63

Slide 63 text

Подозрительные кэши ● В кэш пишут, но не читают ● Кэш пытаются удалить, но не пишут ● Часто обращаются к несуществующим ключам 63

Slide 64

Slide 64 text

Неймспейсы кэшей 64

Slide 65

Slide 65 text

Дэшборд по неймспейсу hit / miss, get / set, etc 65

Slide 66

Slide 66 text

Принцип построения графиков Слишком много промахов hit / miss < 1 66

Slide 67

Slide 67 text

Принцип построения графиков hit / miss > 1 67

Slide 68

Slide 68 text

AnalyzeCacheMetricsCommand.php 68

Slide 69

Slide 69 text

Grafana (Graphite) AnalyzeCacheMetricsCommand.php 69

Slide 70

Slide 70 text

Grafana (Graphite) Report AnalyzeCacheMetricsCommand.php 70

Slide 71

Slide 71 text

Пример отчёта по кэшам 71

Slide 72

Slide 72 text

Пример отчёта по кэшам Ссылка на дэшборд по неймспейсу Список найденных аномалий Неймспейс 72

Slide 73

Slide 73 text

73 Почти всё!

Slide 74

Slide 74 text

74 Наши планы ● Автоматический поиск ненужного кода

Slide 75

Slide 75 text

75 Наши планы ● Автоматический поиск ненужного кода ● Более детальный анализ данных

Slide 76

Slide 76 text

76 Наши планы ● Автоматический поиск ненужного кода ● Более детальный анализ данных ● Обязательно что-нибудь ещё :)

Slide 77

Slide 77 text

Спасибо! 77