Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
Чему мы научились,
разрабатывая
микросервисы?
Мадисон Вадим, М-Тех
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)
Próxima SlideShare
Cargando en…5
×

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

1.866 visualizaciones

Publicado el

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

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

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

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

Publicado en: Ingeniería
  • Sé el primero en comentar

Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (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

×