101
Путь от монолита на PHP к микросервисам на Scala Иванов Денис 2gis.ru

Денис Иванов

Embed Size (px)

Citation preview

Page 1: Денис Иванов

Путь от монолита на PHP кмикросервисам на ScalaИванов Денис

2gis.ru

Page 2: Денис Иванов

2GIS WebAPI

Page 3: Денис Иванов

Данные

3

Page 4: Денис Иванов

Данные

•  8 стран

•  300 городов

•  50 тыс населенных пунктов

4

Page 5: Денис Иванов

Данные

•  8 стран

•  300 городов

•  50 тыс населенных пунктов

•  5 млн организаций

5

Page 6: Денис Иванов

Данные

•  8 стран

•  300 городов

•  50 тыс населенных пунктов

•  5 млн организаций

•  50 млн гео-объектов

И еще много всего

6

Page 7: Денис Иванов

Чиселки

7

Page 8: Денис Иванов

Чиселки

•  30 млн. пользователей в месяц

8

Page 9: Денис Иванов

Чиселки

•  30 млн. пользователей в месяц

•  2000 RPS

9

Page 10: Денис Иванов

Чиселки

•  30 млн. пользователей в месяц

•  2000 RPS

•  3 датацентра

10

Page 11: Денис Иванов

Одна нода•  16 CPU

•  16 GB RAM

•  Минимальная нагрузка - 50%

•  18 штук

11

Page 12: Денис Иванов
Page 13: Денис Иванов

Проблемы

13

Page 14: Денис Иванов

Проблемы

•  Долго отрабатывают запросы (95% - 500ms)

14

Page 15: Денис Иванов

Проблемы

•  Долго отрабатывают запросы (95% - 500ms)

•  Невозможно параллельно, многопоточно выполнять какие-то задачи

15

Page 16: Денис Иванов

Проблемы

•  Долго отрабатывают запросы (95% - 500ms)

•  Невозможно параллельно, многопоточно выполнять какие-то задачи

•  Приложение - один большой кусок, который нужно выкатывать очень

часто и целиком

16

Page 17: Денис Иванов

Проблемы

•  Долго отрабатывают запросы (95% - 500ms)

•  Невозможно параллельно, многопоточно выполнять какие-то задачи

•  Приложение - один большой кусок, который нужно выкатывать очень

часто и целиком

•  Кеширование не спасает

17

Page 18: Денис Иванов

Проблемы

•  Долго отрабатывают запросы (95% - 500ms)

•  Невозможно параллельно, многопоточно выполнять какие-то задачи

•  Приложение - один большой кусок, который нужно выкатывать очень

часто и целиком

•  Кеширование не спасает

•  Много команд разработчиков, сервисов, интеграций

18

Page 19: Денис Иванов

Проблемы

•  Долго отрабатывают запросы (95% - 500ms)

•  Невозможно параллельно, многопоточно выполнять какие-то задачи

•  Приложение - один большой кусок, который нужно выкатывать очень

часто и целиком

•  Кеширование не спасает

•  Много команд разработчиков, сервисов, интеграций

•  Много тестов, которые долго работают

19

Page 20: Денис Иванов

Решения

20

Page 21: Денис Иванов

Решения

•  Поддерживать существующее и жить дальше

21

Page 22: Денис Иванов

Решения

•  Поддерживать существующее и жить дальше

•  Переписать всё нафиг

22

Page 23: Денис Иванов

Решения

•  Поддерживать существующее и жить дальше

•  Переписать всё нафиг

•  Подумать и распилить приложение на независимые куски

23

Page 24: Денис Иванов

Сервисная архитектура (SOA)— модульный подход к разработке программного обеспечения,

основанный на использовании распределённых, слабо связанных

заменяемых компонентов, оснащённых стандартизированными

интерфейсами для взаимодействия по стандартизированным

протоколам

24

Page 25: Денис Иванов

Микросервисная архитектура• Малый размер

• Тонкое масштабирование

• Быстрый деплой

• Лёгкость тестирования (Мок)

• Любой язык

25

Page 26: Денис Иванов

Микросервисная архитектура• Десятки приложений вместо одного

• Сложность интеграционного тестирования

26

Page 27: Денис Иванов

Поехали!

Page 28: Денис Иванов
Page 29: Денис Иванов
Page 30: Денис Иванов
Page 31: Денис Иванов
Page 32: Денис Иванов
Page 33: Денис Иванов
Page 34: Денис Иванов
Page 35: Денис Иванов
Page 36: Денис Иванов
Page 37: Денис Иванов
Page 38: Денис Иванов

Микросервисы — это просто!

Page 39: Денис Иванов

Микросервисы — это просто!

Page 40: Денис Иванов

Что сделали?•  Дикую новую архитектуру

40

Page 41: Денис Иванов

Что сделали?•  Дикую новую архитектуру

•  Написали роутер на go

41

Page 42: Денис Иванов

Что сделали?•  Дикую новую архитектуру

•  Написали роутер на go

•  Базовый контейнер на busybox

42

Page 43: Денис Иванов

Что сделали?•  Дикую новую архитектуру

•  Написали роутер на go

•  Базовый контейнер на busybox

•  Начали пилить SDK

43

Page 44: Денис Иванов

STOP!

Page 45: Денис Иванов

Как распилить?

45

Page 46: Денис Иванов

Как распилить?•  Выделить каждую группу методов в отдельный сервис

46

Page 47: Денис Иванов

Как распилить?•  Выделить каждую группу методов в отдельный сервис

•  Начать с самого мелкого и несвязного сервиса

47

Page 48: Денис Иванов

Как распилить?•  Выделить каждую группу методов в отдельный сервис

•  Начать с самого мелкого и несвязного сервиса

•  Постепенно выделять сервисы, переходя к более крупным

48

Page 49: Денис Иванов

Прототип

49

Page 50: Денис Иванов

Прототип

•  Тяжелый метод - поисковый запрос, запросы в БД, формирование

2000 маркеров с хешами, куча json-а

50

Page 51: Денис Иванов

Прототип

•  Тяжелый метод - поисковый запрос, запросы в БД, формирование

2000 маркеров с хешами, куча json-а

•  PHP, PHP7, Java, Scala

51

Page 52: Денис Иванов

Прототип

•  Тяжелый метод - поисковый запрос, запросы в БД, формирование

2000 маркеров с хешами, куча json-а

•  PHP, PHP7, Java, Scala

•  SLA - 95% за 300ms

52

Page 53: Денис Иванов

Прототип

•  Тяжелый метод - поисковый запрос, запросы в БД, формирование

2000 маркеров с хешами, куча json-а

•  PHP, PHP7, Java, Scala

•  SLA - 95% за 300ms

•  Тачка - 4 ядра (по 2.7), 4 гига

53

Page 54: Денис Иванов

Бенчмарк

54

Page 55: Денис Иванов

Бенчмарк

Реализация SLA Смерть

php 30 rps 40 rps

php7 70 rps 80 rps

java 160 rps 180 rps

scala 180 rps 200 rps

55

Page 56: Денис Иванов

Scala vs Java

56

Page 57: Денис Иванов

Scala vs Java•  Те же библиотеки + свои

57

Page 58: Денис Иванов

Scala vs Java•  Те же библиотеки + свои

•  Меньше кода, чем на Java

58

Page 59: Денис Иванов

Scala vs Java•  Те же библиотеки + свои

•  Меньше кода, чем на Java

•  Много success-story в микросервисах

59

Page 60: Денис Иванов

Scala vs Java•  Те же библиотеки + свои

•  Меньше кода, чем на Java

•  Много success-story в микросервисах

•  Асинхронность и многопоточность намного проще из коробки +

сторонние библиотеки

60

Page 61: Денис Иванов

Scala vs Java•  Те же библиотеки + свои

•  Меньше кода, чем на Java

•  Много success-story в микросервисах

•  Асинхронность и многопоточность намного проще из коробки +

сторонние библиотеки

•  В компании есть несколько команд, использующих Scala на

продакшене

61

Page 62: Денис Иванов

Интеграция

Page 63: Денис Иванов
Page 64: Денис Иванов
Page 65: Денис Иванов
Page 66: Денис Иванов

Библиотечки

66

Page 67: Денис Иванов

Библиотечки

•  Spray

67

Page 68: Денис Иванов

Библиотечки

•  Spray

•  Spray json

68

Page 69: Денис Иванов

Библиотечки

•  Spray

•  Spray json

•  Typesafe config

69

Page 70: Денис Иванов

Библиотечки

•  Spray

•  Spray json

•  Typesafe config

•  Akka

70

Page 71: Денис Иванов

Библиотечки

•  Spray

•  Spray json

•  Typesafe config

•  Akka

•  HikariCP

71

Page 72: Денис Иванов

Библиотечки

•  Spray

•  Spray json

•  Typesafe config

•  Akka

•  HikariCP

•  JDBC

72

Page 73: Денис Иванов

Spray

path("api" / "1.0" / "some" / "method") {

parameters('id.as[String]) { id =>

val response = DoSomeWork(id)

onSuccess(response) { content =>

complete(content)

}

}

}

01.

02.

03.

04.

05.

06.

07.

08.

73

Page 74: Денис Иванов

Spray jsoncase class User(name: String, isOk: Boolean)

implicit val UserFormatter = jsonFormat2(User)

val json = """{"name": "Denis", "isOk": true}"""

val user = json.parseJson.convertTo[User]

01.

02.

03.

04.

05.

06.

07.

74

Page 75: Денис Иванов

Typesafe configdatabases {

catalog {

host = "127.0.0.1"

port = 5432

timeout = 5s

ssl = true

}

}

01.

02.

03.

04.

05.

06.

07.

08.

75

Page 76: Денис Иванов

Инвентарь

76

Page 77: Денис Иванов

Инвентарь

•  Scala - основной язык для микросервисов

77

Page 78: Денис Иванов

Инвентарь

•  Scala - основной язык для микросервисов

•  TeamCity - сборка и деплой

78

Page 79: Денис Иванов

Инвентарь

•  Scala - основной язык для микросервисов

•  TeamCity - сборка и деплой

•  Ansible - деплой

79

Page 80: Денис Иванов

Тестирование

80

Page 81: Денис Иванов

Тестирование

•  Функциональные и интеграционные тесты на ваш продукт, которые у

вас должны быть

81

Page 82: Денис Иванов

Тестирование

•  Функциональные и интеграционные тесты на ваш продукт, которые у

вас должны быть

•  Для нагрузки - gatling

82

Page 83: Денис Иванов

Тестирование

•  Функциональные и интеграционные тесты на ваш продукт, которые у

вас должны быть

•  Для нагрузки - gatling

•  gor

83

Page 84: Денис Иванов

Тестирование

•  Функциональные и интеграционные тесты на ваш продукт, которые у

вас должны быть

•  Для нагрузки - gatling

•  gor

•  Простой скрипт, кидающий запрос на 2 хоста и делающий diff

84

Page 85: Денис Иванов

CI/CD

85

Page 86: Денис Иванов

CI/CD

•  Сборка - 2 минуты

86

Page 87: Денис Иванов

CI/CD

•  Сборка - 2 минуты

•  Тесты (с нагрузкой) - 5-10 минут

87

Page 88: Денис Иванов

CI/CD

•  Сборка - 2 минуты

•  Тесты (с нагрузкой) - 5-10 минут

•  Деплой - 5 минут

88

Page 89: Денис Иванов

CI/CD

•  Сборка - 2 минуты

•  Тесты (с нагрузкой) - 5-10 минут

•  Деплой - 5 минут

•  Серверов - 6 вместо 18 (по 2 в каждом ДЦ)

89

Page 90: Денис Иванов

Одна нода•  4 CPU

•  4 GB RAM

•  Средняя нагрузка - 5%

•  Максимальная нагрузка - 30%

90

Page 91: Денис Иванов
Page 92: Денис Иванов

Что дальше?

92

Page 93: Денис Иванов

Что дальше?•  Продолжать распиливать сервисы

93

Page 94: Денис Иванов

Что дальше?•  Продолжать распиливать сервисы

•  Двигаться к поставленной цели

94

Page 95: Денис Иванов

Итоги

95

Page 96: Денис Иванов

Итоги

•  Поменьше велосипедов

96

Page 97: Денис Иванов

Итоги

•  Поменьше велосипедов

•  Ставьте себе четкие, достижимые цели в короткий срок

97

Page 98: Денис Иванов

Итоги

•  Поменьше велосипедов

•  Ставьте себе четкие, достижимые цели в короткий срок

•  Делайте задачи итеративно

98

Page 99: Денис Иванов

Итоги

•  Поменьше велосипедов

•  Ставьте себе четкие, достижимые цели в короткий срок

•  Делайте задачи итеративно

•  Решайте проблемы по мере из возникновения

99

Page 100: Денис Иванов

Итоги

•  Поменьше велосипедов

•  Ставьте себе четкие, достижимые цели в короткий срок

•  Делайте задачи итеративно

•  Решайте проблемы по мере из возникновения

•  Преждевременная оптимизация - зло

100

Page 101: Денис Иванов

Вопросы?

Иванов Денис

[email protected]

101