Upload
codefest
View
335
Download
0
Embed Size (px)
Citation preview
2GIS WebAPI
Данные
3
Данные
• 8 стран
• 300 городов
• 50 тыс населенных пунктов
4
Данные
• 8 стран
• 300 городов
• 50 тыс населенных пунктов
• 5 млн организаций
5
Данные
• 8 стран
• 300 городов
• 50 тыс населенных пунктов
• 5 млн организаций
• 50 млн гео-объектов
И еще много всего
6
Чиселки
7
Чиселки
• 30 млн. пользователей в месяц
8
Чиселки
• 30 млн. пользователей в месяц
• 2000 RPS
9
Чиселки
• 30 млн. пользователей в месяц
• 2000 RPS
• 3 датацентра
10
Одна нода• 16 CPU
• 16 GB RAM
• Минимальная нагрузка - 50%
• 18 штук
11
Проблемы
13
Проблемы
• Долго отрабатывают запросы (95% - 500ms)
14
Проблемы
• Долго отрабатывают запросы (95% - 500ms)
• Невозможно параллельно, многопоточно выполнять какие-то задачи
15
Проблемы
• Долго отрабатывают запросы (95% - 500ms)
• Невозможно параллельно, многопоточно выполнять какие-то задачи
• Приложение - один большой кусок, который нужно выкатывать очень
часто и целиком
16
Проблемы
• Долго отрабатывают запросы (95% - 500ms)
• Невозможно параллельно, многопоточно выполнять какие-то задачи
• Приложение - один большой кусок, который нужно выкатывать очень
часто и целиком
• Кеширование не спасает
17
Проблемы
• Долго отрабатывают запросы (95% - 500ms)
• Невозможно параллельно, многопоточно выполнять какие-то задачи
• Приложение - один большой кусок, который нужно выкатывать очень
часто и целиком
• Кеширование не спасает
• Много команд разработчиков, сервисов, интеграций
18
Проблемы
• Долго отрабатывают запросы (95% - 500ms)
• Невозможно параллельно, многопоточно выполнять какие-то задачи
• Приложение - один большой кусок, который нужно выкатывать очень
часто и целиком
• Кеширование не спасает
• Много команд разработчиков, сервисов, интеграций
• Много тестов, которые долго работают
19
Решения
20
Решения
• Поддерживать существующее и жить дальше
21
Решения
• Поддерживать существующее и жить дальше
• Переписать всё нафиг
22
Решения
• Поддерживать существующее и жить дальше
• Переписать всё нафиг
• Подумать и распилить приложение на независимые куски
23
Сервисная архитектура (SOA)— модульный подход к разработке программного обеспечения,
основанный на использовании распределённых, слабо связанных
заменяемых компонентов, оснащённых стандартизированными
интерфейсами для взаимодействия по стандартизированным
протоколам
24
Микросервисная архитектура• Малый размер
• Тонкое масштабирование
• Быстрый деплой
• Лёгкость тестирования (Мок)
• Любой язык
25
Микросервисная архитектура• Десятки приложений вместо одного
• Сложность интеграционного тестирования
26
Поехали!
Микросервисы — это просто!
Микросервисы — это просто!
Что сделали?• Дикую новую архитектуру
40
Что сделали?• Дикую новую архитектуру
• Написали роутер на go
41
Что сделали?• Дикую новую архитектуру
• Написали роутер на go
• Базовый контейнер на busybox
42
Что сделали?• Дикую новую архитектуру
• Написали роутер на go
• Базовый контейнер на busybox
• Начали пилить SDK
43
STOP!
Как распилить?
45
Как распилить?• Выделить каждую группу методов в отдельный сервис
46
Как распилить?• Выделить каждую группу методов в отдельный сервис
• Начать с самого мелкого и несвязного сервиса
47
Как распилить?• Выделить каждую группу методов в отдельный сервис
• Начать с самого мелкого и несвязного сервиса
• Постепенно выделять сервисы, переходя к более крупным
48
Прототип
49
Прототип
• Тяжелый метод - поисковый запрос, запросы в БД, формирование
2000 маркеров с хешами, куча json-а
50
Прототип
• Тяжелый метод - поисковый запрос, запросы в БД, формирование
2000 маркеров с хешами, куча json-а
• PHP, PHP7, Java, Scala
51
Прототип
• Тяжелый метод - поисковый запрос, запросы в БД, формирование
2000 маркеров с хешами, куча json-а
• PHP, PHP7, Java, Scala
• SLA - 95% за 300ms
52
Прототип
• Тяжелый метод - поисковый запрос, запросы в БД, формирование
2000 маркеров с хешами, куча json-а
• PHP, PHP7, Java, Scala
• SLA - 95% за 300ms
• Тачка - 4 ядра (по 2.7), 4 гига
53
Бенчмарк
54
Бенчмарк
Реализация SLA Смерть
php 30 rps 40 rps
php7 70 rps 80 rps
java 160 rps 180 rps
scala 180 rps 200 rps
55
Scala vs Java
56
Scala vs Java• Те же библиотеки + свои
57
Scala vs Java• Те же библиотеки + свои
• Меньше кода, чем на Java
58
Scala vs Java• Те же библиотеки + свои
• Меньше кода, чем на Java
• Много success-story в микросервисах
59
Scala vs Java• Те же библиотеки + свои
• Меньше кода, чем на Java
• Много success-story в микросервисах
• Асинхронность и многопоточность намного проще из коробки +
сторонние библиотеки
60
Scala vs Java• Те же библиотеки + свои
• Меньше кода, чем на Java
• Много success-story в микросервисах
• Асинхронность и многопоточность намного проще из коробки +
сторонние библиотеки
• В компании есть несколько команд, использующих Scala на
продакшене
61
Интеграция
Библиотечки
66
Библиотечки
• Spray
67
Библиотечки
• Spray
• Spray json
68
Библиотечки
• Spray
• Spray json
• Typesafe config
69
Библиотечки
• Spray
• Spray json
• Typesafe config
• Akka
70
Библиотечки
• Spray
• Spray json
• Typesafe config
• Akka
• HikariCP
71
Библиотечки
• Spray
• Spray json
• Typesafe config
• Akka
• HikariCP
• JDBC
72
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
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
Typesafe configdatabases {
catalog {
host = "127.0.0.1"
port = 5432
timeout = 5s
ssl = true
}
}
01.
02.
03.
04.
05.
06.
07.
08.
75
Инвентарь
76
Инвентарь
• Scala - основной язык для микросервисов
77
Инвентарь
• Scala - основной язык для микросервисов
• TeamCity - сборка и деплой
78
Инвентарь
• Scala - основной язык для микросервисов
• TeamCity - сборка и деплой
• Ansible - деплой
79
Тестирование
80
Тестирование
• Функциональные и интеграционные тесты на ваш продукт, которые у
вас должны быть
81
Тестирование
• Функциональные и интеграционные тесты на ваш продукт, которые у
вас должны быть
• Для нагрузки - gatling
82
Тестирование
• Функциональные и интеграционные тесты на ваш продукт, которые у
вас должны быть
• Для нагрузки - gatling
• gor
83
Тестирование
• Функциональные и интеграционные тесты на ваш продукт, которые у
вас должны быть
• Для нагрузки - gatling
• gor
• Простой скрипт, кидающий запрос на 2 хоста и делающий diff
84
CI/CD
85
CI/CD
• Сборка - 2 минуты
86
CI/CD
• Сборка - 2 минуты
• Тесты (с нагрузкой) - 5-10 минут
87
CI/CD
• Сборка - 2 минуты
• Тесты (с нагрузкой) - 5-10 минут
• Деплой - 5 минут
88
CI/CD
• Сборка - 2 минуты
• Тесты (с нагрузкой) - 5-10 минут
• Деплой - 5 минут
• Серверов - 6 вместо 18 (по 2 в каждом ДЦ)
89
Одна нода• 4 CPU
• 4 GB RAM
• Средняя нагрузка - 5%
• Максимальная нагрузка - 30%
90
Что дальше?
92
Что дальше?• Продолжать распиливать сервисы
93
Что дальше?• Продолжать распиливать сервисы
• Двигаться к поставленной цели
94
Итоги
95
Итоги
• Поменьше велосипедов
96
Итоги
• Поменьше велосипедов
• Ставьте себе четкие, достижимые цели в короткий срок
97
Итоги
• Поменьше велосипедов
• Ставьте себе четкие, достижимые цели в короткий срок
• Делайте задачи итеративно
98
Итоги
• Поменьше велосипедов
• Ставьте себе четкие, достижимые цели в короткий срок
• Делайте задачи итеративно
• Решайте проблемы по мере из возникновения
99
Итоги
• Поменьше велосипедов
• Ставьте себе четкие, достижимые цели в короткий срок
• Делайте задачи итеративно
• Решайте проблемы по мере из возникновения
• Преждевременная оптимизация - зло
100