Вадим Мадисон "Опыт разработки через микросервисы"

Post on 09-Jan-2017

178 views 3 download

Transcript of Вадим Мадисон "Опыт разработки через микросервисы"

«Опыт разработки через микросервисы»

• Услуги системной интеграции, начиная от разработки технологических решений и заканчивая доставкой видео-сигнала до конечного пользователя

• Интернет-видеоплатформа для каналов МатчТВ и НТВ-ПЛЮС

• 300 000 одновременных пользователей

• > 1 000 000 уникальных посетителей в сутки

• Отдаем контента до 300 Тб/час

Кривая Гартнера

Появление технологии

Кривая Гартнера

Появление технологии

Ажиотаж (завышенные ожидания)

Кривая Гартнера

Появление технологии

Ажиотаж (завышенные ожидания)

Разочарование

Кривая Гартнера

Появление технологии

Ажиотаж (завышенные ожидания)

Разочарование

Осмысление

Кривая Гартнера

Появление технологии

Ажиотаж (завышенные ожидания)

Разочарование

ОсмыслениеРазвитие

Минусы микросервисов• Распределенные коммуникации, дополнительное API, больше точек отказа и логики их обработки

• Оверхед: сетевой, сериализация/десериализация

• Обнаружение сервисов

• Инструментарий!

А чем они тогда

привлекают?

Плюсы микросервисов• Независимая разработка

• Лучший контроль технического и технологического долга

• Скорость тестирования, доставки, запуска

• Упрощение масштабирования

Когда микросервисы не нужны / вредны?• Небольшой проект

• Сжатые сроки разработки

• Короткий цикл поддержки

• Отсутствие CI / CD

• Нет команды, отвечающей за инфраструктуру

• Высокие требования к эффективности

Когда микросервисы “must have”?• Большой проект

• Высокие нагрузки

• Долгий цикл разработки

• Длительный период жизни и поддержки

• Высокие требования к использованию оптимальных технологий

• Готовы к исследованиям, оптимизациям и новым технологиям

Когда размер имеет значение…

Сервис должен быть независимым!

Сервис независим если…• Возможно описать бизнес-задачу сервиса одним простым предложением

• У сервиса больше одного потребителя

• Деплой сервиса не приводит к деплою других сервисов

Сервис независим если…• Возможно описать бизнес-задачу сервиса одним простым предложением

• У сервиса больше одного потребителя

• Деплой сервиса не приводит к деплою других сервисов

Сервис независим если…• Возможно описать бизнес-задачу сервиса одним простым предложением

• У сервиса больше одного потребителя

• Деплой сервиса не приводит к деплою других сервисов

Общие рекомендации

Общие рекомендации• Не использовать фреймворки

• Собирать проект из шаблона

• Не бояться “copy-paste”

• Обратить внимание на манифест “12-факторное приложение”

Общие рекомендации• Не использовать фреймворки

• Собирать проект из шаблона

• Не бояться “copy-paste”

• Обратить внимание на манифест “12-факторное приложение”

Общие рекомендации• Не использовать фреймворки

• Собирать проект из шаблона

• Не бояться “copy-paste”

• Обратить внимание на манифест “12-факторное приложение”

Общие рекомендации• Не использовать фреймворки

• Собирать проект из шаблона

• Не бояться “copy-paste”

• Обратить внимание на манифест “12-факторное приложение”

https://12factor.net/ru/

Конфигурация

КонфигурацияЧто пробовали?

• файлы конфигурации при деплое разливать по всем целевым машинам

• файлы конфигурации класть в контейнер

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

• при сборке контейнера (ENV DB=…)

• при запуске контейнера

КонфигурацияЧто пробовали?

• файлы конфигурации при деплое разливать по всем целевым машинам

• файлы конфигурации класть в контейнер

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

• при сборке контейнера (ENV DB=…)

• при запуске контейнера

КонфигурацияЧто пробовали?

• файлы конфигурации при деплое разливать по всем целевым машинам

• файлы конфигурации класть в контейнер

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

• при сборке контейнера (ENV DB=…)

• при запуске контейнера

Конфигурация! Единая точка конфигурирования

" Но не единая точка отказа!

! Проверенные решения…

Конфигурация

https://www.consul.io/ https://coreos.com/etcd/

<СЕРВИС>/ (/conf/ms/recorder/)

<СЕРВИС>/<ВЕРСИЯ>/ (/conf/ms/recorder/0.12)

<СЕРВИС>/<СРЕДА>/ (dev, stage, production)

Кофигурация к KV

<СЕРВИС>/ (/conf/ms/recorder/)

<СЕРВИС>/<ВЕРСИЯ>/ (/conf/ms/recorder/0.12)

<СЕРВИС>/<СРЕДА>/ (dev, stage, production)

/conf/ms/recorder/production/db : "recorder"

/conf/ms/recorder/production/server : "10.0.102.2"

Кофигурация к KV

<СЕРВИС>/ (/conf/ms/recorder/)

<СЕРВИС>/<ВЕРСИЯ>/ (/conf/ms/recorder/0.12)

<СЕРВИС>/<СРЕДА>/ (dev, stage, production)

/conf/ms/recorder/0.12/production/db : "recorder"

/conf/ms/recorder/0.12/production/server : "10.0.0.12"

Кофигурация к KV

Конфигурация1. git2consul

• не используем отдельные проекты/бранчи в git для основных параметров

• загружаем конфигурацию при деплое

• стартовый путь: /conf/ms/<ИМЯ СЕРВИСА>/<BUILD NO>/

2. Vaultвсе секретное храним в отдельных проектах

Журналирование• Единый формат логов, сведение в общее хранилище

Журналирование

Health-check! HTTP / HTTPS

! 2 основных метода/ready/health

! 1 опциональный/info

Health-check

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

В чем сложность?• Корректность взаимодействия с другими сервисами

• Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

В чем сложность?• Корректность взаимодействия с другими сервисами

• Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

В чем сложность?• Корректность взаимодействия с другими сервисами

• Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

Circuit Breaker![Hystrix, Netflix]

В чем сложность?• Корректность взаимодействия с другими сервисами

• Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

Circuit Breaker![Hystrix, Netflix]

Тестовыйкластер

Raspberry Pi 3 - 6шт

Хранение

Что пробовали?• Проброс файловой системы в контейнер

Что пробовали?• Проброс файловой системы в контейнер

• «Собирающие контейнеры»

Что пробовали?• Проброс файловой системы в контейнер

• «Собирающие контейнеры»

• Shared data volume

Что пробовали?• Проброс файловой системы в контейнер

• «Собирающие контейнеры»

• Shared data volume

• Flocker

Для файлового храненияРаспределенная файловая система: CEPH (http://ceph.com/)

Для БД• Выделенные сервера

• Особая конфигурация машин

• Расширенная сеть

Оркестрация

Оркестрация

Оркестрация

Оркестрация

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}}

}

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!

Consul Template{{range services}}

{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch "urlprefix-"}}

{{range .Tags}}{{ if . | contains "urlprefix-" }}# Tag: urlprefix-/playlistlocation {{. | replaceAll "urlprefix-" ""}} { {{end}}{{end}}proxy_pass http://{{.Name}}/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;

}{{end}}{{end}}{{end}}

Consul Templateupstream 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;

}

http://bit.ly/1TE1KdMИсходные коды примера

Чек-листКак конфигурировать?

Как мониторить и считать метрики?

Как сервисы будут находить друг друга?

Как сервис будет взаимодействовать с остальными частями проекта?

Как тестировать сервис и систему целиком?

Как обрабатывать сбои связанных сервисов?

Как переезжать на новую версию?

Как масштабировать под нагрузкой?

Спасибо!Вадим Мадисон

М-Тех

vmadison@media-t.ru

vadim.a.madison@gmail.com