Путь от монолита на php к микросервисам на scala / Денис...

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

Upload: ontico

Post on 06-Jan-2017

1.900 views

Category:

Engineering


5 download

TRANSCRIPT

Page 1: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

2gis.ru

Page 2: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

2GIS WebAPI

Page 3: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Данные

3

Page 4: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Данные

•  8 стран

•  300 городов

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

4

Page 5: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Данные

•  8 стран

•  300 городов

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

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

5

Page 6: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Данные

•  8 стран

•  300 городов

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

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

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

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

6

Page 7: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Нагрузка

7

Page 8: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Нагрузка

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

8

Page 9: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Нагрузка

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

•  2000 RPS

9

Page 10: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Нагрузка

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

•  2000 RPS

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

10

Page 11: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Одна нода•  16 CPU

•  16 GB RAM

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

11

Page 12: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 13: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Проблемы

13

Page 14: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Проблемы

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

14

Page 15: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Проблемы

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

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

15

Page 16: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Проблемы

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

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

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

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

16

Page 17: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Проблемы

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

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

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

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

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

17

Page 18: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Проблемы

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

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

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

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

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

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

18

Page 19: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Проблемы

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

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

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

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

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

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

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

19

Page 20: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Решения

20

Page 21: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Решения

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

21

Page 22: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Решения

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

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

22

Page 23: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Решения

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

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

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

23

Page 24: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

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

протоколам

24

Page 25: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

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

• Любой язык

25

Page 26: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

26

Page 27: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Поехали!

Page 28: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 29: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 30: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 31: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 32: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 33: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 34: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 35: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 36: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 37: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 38: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Shipyard

•  https://shipyard-project.com/

•  Котейнеры

•  Образы

•  Реестры

•  Ноды

•  Логи

•  Консоль

38

Page 39: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Consul

•  https://www.consul.io/

•  Дискаверинг

•  Key-value

•  Проверки

•  DNS

39

Page 40: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 41: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Consul-template

•  https://github.com/hashicorp/consul-template

41

Page 42: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Consul-template

{{range tree "service/redis@east-aws"}}

{{.Key}} {{.Value}}{{end}}

42

Page 43: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Cadvisor

•  https://github.com/google/cadvisor

43

Page 44: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 45: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Схема работы

Page 46: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 47: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 48: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 49: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 50: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 51: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 52: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 53: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Router

{

"route": "/api/1.0/some/method",

"chain": [

...

]

}

53

Page 54: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Router chain

{ "key": "ms4",

"method": "/api/0.0.1/ms4",

"data": {},

"timeout": 2000,

"maxRetries": 0,

"isVital": true,

"waitFor": ["ms1", "ms2"] }

54

Page 55: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 56: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 57: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 58: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 59: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Базовый образ для контейнера•  Ubuntu ~500мб, deb-пакеты

59

Page 60: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Базовый образ для контейнера•  Ubuntu ~500мб, deb-пакеты

•  BusyBox ~50мб, нет пакетов

60

Page 61: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Java SDK

61

Page 62: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Java SDK•  Gradle

62

Page 63: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Java SDK•  Gradle

•  Jetty

63

Page 64: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Java SDK•  Gradle

•  Jetty

•  BoneCP

64

Page 65: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Java SDK•  Gradle

•  Jetty

•  BoneCP

•  JDBC

65

Page 66: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

STOP!

Page 67: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

67

Page 68: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

68

Page 69: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

69

Page 70: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

70

Page 71: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Прототип

71

Page 72: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Прототип

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

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

72

Page 73: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Прототип

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

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

•  PHP, PHP7, Java, Scala

73

Page 74: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Прототип

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

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

•  PHP, PHP7, Java, Scala

•  SLA - 95% за 300ms

74

Page 75: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Бенчмарк

75

Page 76: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Бенчмарк

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

php 30 rps 40 rps

php7 70 rps 80 rps

java 160 rps 180 rps

scala 180 rps 200 rps

76

Page 77: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Scala vs Java

77

Page 78: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

78

Page 79: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

79

Page 80: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

80

Page 81: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

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

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

81

Page 82: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

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

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

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

продакшене

82

Page 83: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Интеграция

Page 84: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 85: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 86: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Page 87: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Библиотечки

87

Page 88: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Библиотечки

•  Spray

88

Page 89: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Библиотечки

•  Spray

•  Spray json

89

Page 90: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Библиотечки

•  Spray

•  Spray json

•  Typesafe config

90

Page 91: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Библиотечки

•  Spray

•  Spray json

•  Typesafe config

•  Akka

91

Page 92: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Библиотечки

•  Spray

•  Spray json

•  Typesafe config

•  Akka

•  HikariCP

92

Page 93: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Библиотечки

•  Spray

•  Spray json

•  Typesafe config

•  Akka

•  HikariCP

•  JDBC

93

Page 94: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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.

94

Page 95: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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.

95

Page 96: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Typesafe configdatabases {

catalog {

host = "127.0.0.1"

port = 5432

timeout = 5s

}

}

01.

02.

03.

04.

05.

06.

07.

96

Page 97: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Инвентарь

97

Page 98: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Инвентарь

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

98

Page 99: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Инвентарь

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

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

99

Page 100: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Инвентарь

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

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

•  Ansible - деплой

100

Page 101: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

101

Page 102: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

102

Page 103: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

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

103

Page 104: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

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

•  Для реверс-инжиниринга - gor

104

Page 105: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

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

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

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

•  Для реверс-инжиниринга - gor

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

105

Page 106: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Стало

106

Page 107: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Стало

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

107

Page 108: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Стало

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

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

108

Page 109: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Стало

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

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

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

109

Page 110: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Стало

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

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

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

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

110

Page 111: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Одна нода•  4 CPU

•  4 GB RAM

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

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

111

Page 112: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Грабли

112

Page 113: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Грабли

•  CORS

113

Page 114: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Грабли

•  CORS

•  gzip

114

Page 115: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Что дальше?

115

Page 116: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

116

Page 117: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

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

•  Двигаться к поставленной цели (к "идеалу")

117

Page 118: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Итоги

118

Page 119: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Итоги

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

119

Page 120: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Итоги

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

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

120

Page 121: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Итоги

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

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

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

121

Page 122: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Итоги

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

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

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

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

122

Page 123: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Итоги

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

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

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

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

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

123

Page 124: Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)

Вопросы?

Иванов Денис

[email protected]

124