Мастер-класс "Микросервисы: удобно, надежно,...
TRANSCRIPT
Микросервисы: удобно, надежно, серебрянопульноЕвгений ПавловСергей Шумов
Кто мы?News360 – новостной агрегатор• 6M загрузок• 100K активных пользователей• 30000 источников
Native.AI – аналитика• 20M событий в день• 100M в перспективе• Трекинг Reuters.com
Что было• SOA• Большие сервисы• Legacy код• Одна платформа
Проблемы • Поддержка• Обновление• Производительность• Инструменты
Что мы сделалиДробление сервисов на более мелкиеИспользование подходящих языков и технологийПлавная миграция на открытые решения
Микросервисы• Сервис, который можно написать за 2 недели• Single responsibility• Bounded context
Преимущества микросервисов• Независимое обновление• Масштабирование• Возможность экспериментировать• Простота• Поддержка любым разработчиком• Адаптация под требования
Search
Crawler
Система поиска статей
Scheduler API
Crawler
Article Extractor
Renderer
IndexerSearch API Elastic Search
Типы коммуникации• RPC (HTTP)• Message bus (RabbitMQ, Kafka)• Permanent connect (TCP)
Система поиска статей
Scheduler API
Crawler
Article Extractor
Renderer
IndexerSearch API
HTTP
HTTPHTTP
HTTP RabbitMQ
RabbitMQ
HTTP
RabbitMQ
Elastic Search
Формат сообщенийТипы сообщений:• Text (Json) – общий формат• Binary (Protobuf) - highload
Best practices:• Cross-platform contracts• Cross-platform data types
Система поиска статей
Scheduler API
Crawler
Article Extractor
Renderer
IndexerSearch API
HTTP
HTTPHTTP
HTTP RabbitMQ
RabbitMQ
HTTP
RabbitMQ
Elastic Search
Protobuf JSON
JSON
JSON
JSONJSON
Communication bad practices• Платформо-зависимые технологии• Свои библиотеки для RPC• Свои библиотеки-клиенты• DTO в библиотеках• Общий DTO для многих сервисов
Deployment• Windows service• IIS web service• Self-host web service• Linux services in Docker • Rancher orchestration
Мониторинг• Логи • Метрики сервисов• Сервис status API (HTTP)• Мониторинг машин• Мониторинг очередей
Логи• Logstash + centralized file storage• ElasticsSearch + fluentd + Kibana• Структурированные логи (json)
Метрики• Graphite + Grafana (statsd)• Zabbix + Grafana integration• Riemann + InfluxDB – отказались
Масштабирование• Вручную для Windows сервисов• Nginx http load balancer• Rancher – автоматизированно• Auto-scaling – не используем
Отказоустойчивость• Готовность к падению другого сервиса• Деградация функциональности• Отсутствие зависаний – лучше падение
Отказоустойчивость - техники• Сonnection restoring • Retries• Timeouts• Message bus - exactly once delivery• HealthChecks
Message bus техники• Messages reject • RabbitMQ Dead Letter Exchanges (DLX)• Long retries on DLX
Long retries on RabbitMQ
Input queue
Error queue
Input queue DLX
Retry queue DLX
Reject
TTL Retry queue
ServicePublishConsume
Continuous integration• Build CI – unit and integration• Deploy CI – service functional tests• Commit CI – Drone.io
Документация• Swagger для http-сервисов• README.md• Описание сервиса в Wiki• Сводная таблица сервисов• Архитектурные диаграммы
Документация для сервиса• Краткое описание
функциональности• Репозиторий• Конфиги• Деплои• Логи• Мониторинг
• Тесты• Внешние зависимости• Требования к
производительности• Критичность• Ответственный
Стандартизация• Стандарты использования технологий• Шаблоны микросервисов• Логи, мониторинг и т.д.• Сode conventions
Свобода
Скорость?
Практики разработки• Ответственность - Owner, team• 1-2 разработчика на сервис• Сross-team code review• Git-репозиторий для сервиса• Минимизация зависимостей • Уменьшать связанность сервисов• Часто копи-паст лучше
Трудности• Схема взаимодействия сервисов • Актуальность диаграмм• Много рутины• Глобальный рефакторинг архитектуры• Зоопарк технологий
Спасибо за внимание!
Вопросы?