golang в avito
TRANSCRIPT
Golang в AvitoСергей Орлов
Вячеслав КрюковАндрей Скоморохов
Go 1.8 Release Party, 16 февраля 2017
Микросервисы
Архитектура Avito - февраль 2017
• Монолит
• Мобильное API
• API для frontend
• Backend services
API Gateway
Почему Go•Поддерживаемость кода (это важно)
•Экономия ресурсов
•Асинхронная модель исполнения
•Скорость исполнения
•Go-программисты :)
Сервисы это трудно
Требования к эксплуатации
• Управление приложениями
• Мониторинг
• Развертывание
Шаблон сервиса
• Управление приложениями
• Мониторинг
• Развертывание
RT Indexer
Sphinx RT Indexes• Обновление полнотекстовых данных на лету
• Демон Searchd работает одновременно на чтение и запись
• Indexer не нужен
• Обновления документов прилетают в Ram
• Заполненный Ram сбрасывается на Disk
• Старые версии перекрываются через Kill List
Инфраструктура поиска
RT indexer
RT indexer
RT indexer
Golang pipelines• https://blog.golang.org/pipelines
• Выделяем несколько воркеров • Соединяем воркеры последовательно каналами • Подаем исходные данные в первый воркер • Каждый воркер принимает данные из входящего канала • Создает свой исходящий канал и отправляет в него результат • Последний воркер не создает исходящего канала • При закрытии входящего канала воркер перекращает работу • И закрывает свой исходящий канал
RT indexer
RT indexer
RT indexer
RT indexer
RT indexer
RT indexer
RT indexer
RT indexer
RT indexer
RT indexer
RT indexer
RT indexer
RT Indexer, производительность
• До 500 rps для обновлений, в пике до 1000 rps
• Поисковая нагрузка - 17000 rps
Производительность на запись
Поисковая нагрузка
Отставание от Replica
Go в отделе QA
Bash Bash Bash
Как было раньше
…
Server 1 Server 2 Server N
Что хотелось получить
• Единая входная точка
• Система хранения результатов выполнения
• Честная очередь выполнения
Что получилосьClient (Team City, Bamboo, custom)
Main (parallel, start, restart)
Worker Manager
Worker1 … WorkerN
Worker Manager
Worker1 … WorkerN
Env Manager
Test Report
RabbitMQ
Test Report View
Общие модели запросов и ответов в структурах
• Валидация по типам
• Описания полей структуры к полям json экономят время
Воркеры в goroutines
• Доставка управляющих сообщений по отдельному каналу
• Единая система хранения результатов припроблемах с доставкой
Worker Manager
Worker1 … WorkerN
Радость при реализации Json RPC 2.0
• Реализации batch request через goroutine
• Указатели в структурах дают простой механизм опциональных значений для аргументов
Что получили в итоге от Go
• Простотой язык для изучения
• Скорость разработки
• Ресурсы, используемые сервером c сервисом на Go, в десятки раз меньше чем с сервисом на PHP
Вопросы