Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Чему мы научились,
разрабатывая
микросервисы?
Мадисон Вадим, М-Тех
2016
• Услуги системной интеграции, начиная от разработки технологических
решений и заканчивая доставкой видео-сигнала до конеч...
— Достучаться до небес (фильм)
«Пойми, на небесах только и говорят, что

о море. Как оно бесконечно прекрасно…»
Кто не знает, что
такое микросервис?
Проблемы
микросервисов
Проблемы
• Pipeline: для каждого свой проект в git, CI, …
• Сложность системы: распределенные коммуникации, дополнительное...
17 (1/20)→340→1120
Проблемы
• Оверхед: сетевой, сериализация/десериализация
• Обнаружение сервисов
• Постоянный контроль независимости сервис...
А чем они
тогда
привлекают?


В чем бонусы?
• Независимая разработка
В чем бонусы?
• Независимая разработка
• Отсутствие завязки на технологии
В чем бонусы?
• Независимая разработка
• Отсутствие завязки на технологии
• Скорость тестирования (независимость при тести...
В чем бонусы?
• Независимая разработка
• Отсутствие завязки на технологии
• Скорость тестирования (независимость при тести...
В чем бонусы?
• Независимая разработка
• Отсутствие завязки на технологии
• Скорость тестирования (независимость при тести...
Насколько микро-
должен быть -сервис?
Насколько микро- должен быть
микросервис?
• По длительности разработки
Насколько микро- должен быть
микросервис?
• По длительности разработки
• По количеству строк кода
Насколько микро- должен быть
микросервис?
• По длительности разработки
• По количеству строк кода
• По количеству разработ...
Сервис должен быть независимым!
Как проверить
независимость?
Как проверить независимость?
1. Опишите бизнес-задачу сервиса одним простым предложением
Как проверить независимость?
1. Опишите бизнес-задачу сервиса одним простым предложением
2. Какое количество потребителей ...
Как проверить независимость?
1. Опишите бизнес-задачу сервиса одним простым предложением
2. Какое количество потребителей ...
Требования к микросервису
• Скрывает внутренние детали реализации
• Деплоится независимо
• Падая, не роняет все остальное
...
Как готовить?
Конфигурация
Конфигурация
Что пробовали?
• файлы конфигурации при деплое разливать по всем целевым машинам
Конфигурация
Что пробовали?
• файлы конфигурации при деплое разливать по всем целевым машинам
• файлы конфигурации класть ...
Конфигурация
Что пробовали?
• файлы конфигурации при деплое разливать по всем целевым машинам
• файлы конфигурации класть ...
Конфигурация
• Общее K/V хранилище
• Сервис должен быть заточен под смену конфигурации
• Микс вариаций с приоритетами:
<СЕ...
Конфигурация
1. git2consul
• не используем отдельные проекты/бранчи в git для основных параметров
• загружаем конфигурацию...
Мониторинг
736
Как решать?
Как решать?
• Помнить, что микросервисы — они как PHP, только микросервисы
Как решать?
• Помнить, что микросервисы — они как PHP, только микросервисы
• Вместо полноценного мониторинга — строим dash...
Как решать?
• Помнить, что микросервисы — они как PHP, только микросервисы
• Вместо полноценного мониторинга — строим dash...
Как решать?
• Помнить, что микросервисы — они как PHP, только микросервисы
• Вместо полноценного мониторинга — строим dash...
Наш стек
1. Сбор метрик - это важно, но еще важнее постоянный анализ полученных
данных
2. Система мониторинга должна быть более над...
Тестирование
В чем сложность?
1. Корректность взаимодействия с другими сервисами
В чем сложность?
1. Корректность взаимодействия с другими сервисами
2. Сервис назначения доступен, но:
• Отвечает очень ме...
В чем сложность?
1. Корректность взаимодействия с другими сервисами
2. Сервис назначения доступен, но:
• Отвечает очень ме...
В чем сложность?
1. Корректность взаимодействия с другими сервисами
2. Сервис назначения доступен, но:
• Отвечает очень ме...
Этапы тестирования
Тестовый

кластер
Raspberry
Pi 3 - 6шт


Фото: pocketcluster.wordpress.com
Хранение
Что пробовали?
• Проброс файловой системы в контейнер
Что пробовали?
• Проброс файловой системы в контейнер
• «Собирающие контейнеры»
Что пробовали?
• Проброс файловой системы в контейнер
• «Собирающие контейнеры»
• Shared data volume
Что пробовали?
• Проброс файловой системы в контейнер
• «Собирающие контейнеры»
• Shared data volume
• Flocker
Для файлового
хранения
Распределенная файловая система: 

CEPH (http://ceph.com/)
Для БД
• Выделенные сервера
• Особая конфигурация машин
• Расширенная сеть
Обнаружение
сервисов
Реестр сервисов
• consul — key/value хранилище, DNS, Health-Check, работа с несколькими ДЦ из коробки
• etcd — key/value х...
Оркестрация
• docker swarm [1.2.2] — доставка, регистрация, масштабирование (consul)
• nomad [0.3.2] — доставка, регистрац...
Consul Template
{{range services}}{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch "urlprefix-"}}
upstream {{.Na...
Consul Template
{{range services}}

{{ if in .Tags "demo" }}

{{if .Tags | join "," | regexMatch “urlprefix-“}} #urlprefix...
Consul Template
{{range services}}
{{ if in .Tags "demo" }}
{{if .Tags | join "," | regexMatch "urlprefix-"}}
{{range .Tag...
Consul Template
upstream playlistapi {
least_conn;
server 10.1.1.2:5100 max_fails=3 fail_timeout=30 weight=1;
}


... 

lo...
http://bit.ly/1TE1KdM
Исходные коды примера
Чек-лист
Как конфигурировать?
Как мониторить и считать метрики?
Как сервисы будут находить друг друга?
Как сервис будет вз...
Спасибо!
Вадим Мадисон
М-Тех
vmadison@rutube.ru
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Upcoming SlideShare
Loading in …5
×

Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

1,687 views

Published on

Начав разработку нового продукта через микросервисы, мы неожиданно для себя обнаружили, что микросервисы — это не просто "вместо одного большого приложения теперь пишем много маленьких". При разработке большой системы она сама собой через какое-то время становится набором отдельных сервисов, которые должны взаимодействовать между собой, поэтому стабильная работа сервисов и их взаимодействие не стало чем-то новым. Неожиданностью стало то, что система стала значительно более динамической, она стала постоянно изменяться отдельными небольшими частями, сервисы стали часто перезапускаться, а количество запущенных нод сервисов стало расти по экспоненте.

Очень быстро стал актуальным вопрос конфигурирования — если раньше, выкатив новую версию монолита с единым конфигом, мы применяли правки на всю систему сразу, то с микросервисами все сложнее — пара сотен работающих нод и всем нужно применить изменения. Требования к деплою также поменялись — он стал частью процесса разработки, а тестирование стало частью деплоя. Количество необходимого ПО для функционирования системы также стало некоторым сюрпризом.

В докладе я расскажу о том, как в итоге это работает у нас, как мы решили такие вопросы как:
- конфигурирование сервисов;
- интеграция между собой;
- тестирование;
- версионирование;
- масштабирование.

Расскажу, какие тулзы мы в итоге используем, а от каких отказались.

Published in: Engineering

Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

  1. 1. Чему мы научились, разрабатывая микросервисы? Мадисон Вадим, М-Тех 2016
  2. 2. • Услуги системной интеграции, начиная от разработки технологических решений и заканчивая доставкой видео-сигнала до конечного пользователя • Интернет-видеоплатформа для каналов МатчТВ и НТВ-ПЛЮС • 300 000 одновременных пользователей • > 1 000 000 уникальных посетителей в сутки • Отдаем контента до 300 Тб/час
  3. 3. — Достучаться до небес (фильм) «Пойми, на небесах только и говорят, что
 о море. Как оно бесконечно прекрасно…»
  4. 4. Кто не знает, что такое микросервис?
  5. 5. Проблемы микросервисов
  6. 6. Проблемы • Pipeline: для каждого свой проект в git, CI, … • Сложность системы: распределенные коммуникации, дополнительное API, больше точек отказа и логики их обработки • Контроль целостности данных, сложность распределенных транзакций
  7. 7. 17 (1/20)→340→1120
  8. 8. Проблемы • Оверхед: сетевой, сериализация/десериализация • Обнаружение сервисов • Постоянный контроль независимости сервисов • Инструментарий!
  9. 9. А чем они тогда привлекают? 

  10. 10. В чем бонусы? • Независимая разработка
  11. 11. В чем бонусы? • Независимая разработка • Отсутствие завязки на технологии
  12. 12. В чем бонусы? • Независимая разработка • Отсутствие завязки на технологии • Скорость тестирования (независимость при тестировании)
  13. 13. В чем бонусы? • Независимая разработка • Отсутствие завязки на технологии • Скорость тестирования (независимость при тестировании) • Легкость масштабирования (если она вообще есть)
  14. 14. В чем бонусы? • Независимая разработка • Отсутствие завязки на технологии • Скорость тестирования (независимость при тестировании) • Легкость масштабирования (если она вообще есть) • Минимизация ущерба при отказе сервиса (при корректной реализации остальных)
  15. 15. Насколько микро- должен быть -сервис?
  16. 16. Насколько микро- должен быть микросервис? • По длительности разработки
  17. 17. Насколько микро- должен быть микросервис? • По длительности разработки • По количеству строк кода
  18. 18. Насколько микро- должен быть микросервис? • По длительности разработки • По количеству строк кода • По количеству разработчиков за N спринтов
  19. 19. Сервис должен быть независимым!
  20. 20. Как проверить независимость?
  21. 21. Как проверить независимость? 1. Опишите бизнес-задачу сервиса одним простым предложением
  22. 22. Как проверить независимость? 1. Опишите бизнес-задачу сервиса одним простым предложением 2. Какое количество потребителей у сервиса?
  23. 23. Как проверить независимость? 1. Опишите бизнес-задачу сервиса одним простым предложением 2. Какое количество потребителей у сервиса? 3. Приводит ли деплой одного сервиса к деплою других сервисов?
  24. 24. Требования к микросервису • Скрывает внутренние детали реализации • Деплоится независимо • Падая, не роняет все остальное • Легко мониторится • Реализует бизнес-модель • Полностью децентрализован
  25. 25. Как готовить?
  26. 26. Конфигурация
  27. 27. Конфигурация Что пробовали? • файлы конфигурации при деплое разливать по всем целевым машинам
  28. 28. Конфигурация Что пробовали? • файлы конфигурации при деплое разливать по всем целевым машинам • файлы конфигурации класть в контейнер
  29. 29. Конфигурация Что пробовали? • файлы конфигурации при деплое разливать по всем целевым машинам • файлы конфигурации класть в контейнер • выставлять переменные окружения • при сборке контейнера (ENV DB=…) • при запуске контейнера
  30. 30. Конфигурация • Общее K/V хранилище • Сервис должен быть заточен под смену конфигурации • Микс вариаций с приоритетами: <СЕРВИС>/ (/conf/ms/recorder/) <СЕРВИС>/<ВЕРСИЯ>/ (/conf/ms/recorder/0.12) <СЕРВИС>/<СРЕДА>/ <СЕРВИС>/<ВЕРСИЯ>/<СРЕДА>/ <СЕРВИС>/<ВЕРСИЯ>/<НОДА>/
  31. 31. Конфигурация 1. git2consul • не используем отдельные проекты/бранчи в git для основных параметров • загружаем конфигурацию при деплое • стартовый путь: 
 /conf/ms/<ИМЯ СЕРВИСА>/<BUILD NO>/ 2. Vault
 все секретное храним в отдельных проектах
  32. 32. Мониторинг
  33. 33. 736
  34. 34. Как решать?
  35. 35. Как решать? • Помнить, что микросервисы — они как PHP, только микросервисы
  36. 36. Как решать? • Помнить, что микросервисы — они как PHP, только микросервисы • Вместо полноценного мониторинга — строим dashboard
  37. 37. Как решать? • Помнить, что микросервисы — они как PHP, только микросервисы • Вместо полноценного мониторинга — строим dashboard • Алерты по статистическим и пороговым значениям вместо бинарных
  38. 38. Как решать? • Помнить, что микросервисы — они как PHP, только микросервисы • Вместо полноценного мониторинга — строим dashboard • Алерты по статистическим и пороговым значениям вместо бинарных • На одном dashboard сводить графики хост-машин и статистики 
 по docker-демону
  39. 39. Наш стек
  40. 40. 1. Сбор метрик - это важно, но еще важнее постоянный анализ полученных данных 2. Система мониторинга должна быть более надежной и масштабируемой, чем то, что она контролирует 3. Система должна быть оптимизирована для распределенных, недолговечных, облачных, контейнеризованных микросервисов 4. Собирайте метрики часто … очень часто … 
 Стремитесь к интервалам < 10 сек Общие рекомендации
  41. 41. Тестирование
  42. 42. В чем сложность? 1. Корректность взаимодействия с другими сервисами
  43. 43. В чем сложность? 1. Корректность взаимодействия с другими сервисами 2. Сервис назначения доступен, но: • Отвечает очень медленно • Отвечает эпизодически • Отвечает некорректно
  44. 44. В чем сложность? 1. Корректность взаимодействия с другими сервисами 2. Сервис назначения доступен, но: • Отвечает очень медленно • Отвечает эпизодически • Отвечает некорректно Circuit Breaker!
  45. 45. В чем сложность? 1. Корректность взаимодействия с другими сервисами 2. Сервис назначения доступен, но: • Отвечает очень медленно • Отвечает эпизодически • Отвечает некорректно Circuit Breaker! [Hystrix, Netflix]
  46. 46. Этапы тестирования
  47. 47. Тестовый
 кластер Raspberry Pi 3 - 6шт 
 Фото: pocketcluster.wordpress.com
  48. 48. Хранение
  49. 49. Что пробовали? • Проброс файловой системы в контейнер
  50. 50. Что пробовали? • Проброс файловой системы в контейнер • «Собирающие контейнеры»
  51. 51. Что пробовали? • Проброс файловой системы в контейнер • «Собирающие контейнеры» • Shared data volume
  52. 52. Что пробовали? • Проброс файловой системы в контейнер • «Собирающие контейнеры» • Shared data volume • Flocker
  53. 53. Для файлового хранения Распределенная файловая система: 
 CEPH (http://ceph.com/)
  54. 54. Для БД • Выделенные сервера • Особая конфигурация машин • Расширенная сеть
  55. 55. Обнаружение сервисов
  56. 56. Реестр сервисов • consul — key/value хранилище, DNS, Health-Check, работа с несколькими ДЦ из коробки • etcd — key/value хранилище • skydock — Health-Check, регистрация docker-контейнеров • skydns — DNS • Apache Zookeeper — вариация key/value хранилища, сервис блокировок, вариация на тему DNS • !redis — запись только в мастер, нет механизма достижения консенсуса при определении актуального состояния данных после выхода из строя отдельных узлов хранилища
  57. 57. Оркестрация • docker swarm [1.2.2] — доставка, регистрация, масштабирование (consul) • nomad [0.3.2] — доставка, регистрация, масштабирование (consul) • kubernetes [1.2.4] — доставка, регистрация, масштабирование, LB (etcd) • mesos [0.28.1] (marathon [1.1.1]) — доставка, регистрация, масштабирование, LB (zookeeper, HAProxy)
  58. 58. Consul Template {{range services}}{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch "urlprefix-"}} upstream {{.Name}} { least_conn; {{range service .Name}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=30 weight=1;{{end}} } {{end}}{{end}}{{end}} server { listen 80 default_server; location /health { add_header Content-Type text/plain; return 200 'OK'; } {{range services}}{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch "urlprefix-"}} {{range .Tags}}{{ if . | contains "urlprefix-" }}location {{. | replaceAll "urlprefix-" ""}} { {{end}}{{end}} proxy_pass http://{{.Name}}/; # / в конце означает обрезку проксируемого пути proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } {{end}}{{end}}{{end}} }
  59. 59. Consul Template {{range services}}
 {{ if in .Tags "demo" }}
 {{if .Tags | join "," | regexMatch “urlprefix-“}} #urlprefix-/playlist upstream {{.Name}} { least_conn; {{range service .Name}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=30 weight=1;{{end}} } {{end}}
 {{end}}
 {{end}} в списке только прошедшие
 health-check!
  60. 60. Consul Template {{range services}} {{ if in .Tags "demo" }} {{if .Tags | join "," | regexMatch "urlprefix-"}} {{range .Tags}}{{ if . | contains "urlprefix-" }} # Tag: urlprefix-/playlist location {{. | replaceAll "urlprefix-" ""}} { {{end}}{{end}} proxy_pass http://{{.Name}}/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } {{end}}{{end}}{{end}}
  61. 61. Consul Template upstream playlistapi { least_conn; server 10.1.1.2:5100 max_fails=3 fail_timeout=30 weight=1; } 
 ... 
 location /playlist { proxy_pass http://playlistapi/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
  62. 62. http://bit.ly/1TE1KdM Исходные коды примера
  63. 63. Чек-лист Как конфигурировать? Как мониторить и считать метрики? Как сервисы будут находить друг друга? Как сервис будет взаимодействовать с остальными частями проекта? Как тестировать сервис и систему целиком? Как обрабатывать сбои связанных сервисов? Как переезжать на новую версию? Как масштабировать под нагрузкой?
  64. 64. Спасибо! Вадим Мадисон М-Тех vmadison@rutube.ru

×