golang в avito

40
Golang в Avito Сергей Орлов Вячеслав Крюков Андрей Скоморохов Go 1.8 Release Party, 16 февраля 2017

Upload: avitotech

Post on 18-Feb-2017

118 views

Category:

Internet


1 download

TRANSCRIPT

Page 1: Golang в avito

Golang в AvitoСергей Орлов

Вячеслав КрюковАндрей Скоморохов

Go 1.8 Release Party, 16 февраля 2017

Page 2: Golang в avito

Микросервисы

Page 3: Golang в avito

Архитектура Avito - февраль 2017

• Монолит

• Мобильное API

• API для frontend

• Backend services

Page 4: Golang в avito

API Gateway

Page 5: Golang в avito

Почему Go•Поддерживаемость кода (это важно)

•Экономия ресурсов

•Асинхронная модель исполнения

•Скорость исполнения

•Go-программисты :)

Page 6: Golang в avito

Сервисы это трудно

Page 7: Golang в avito

Требования к эксплуатации

• Управление приложениями

• Мониторинг

• Развертывание

Page 8: Golang в avito

Шаблон сервиса

• Управление приложениями

• Мониторинг

• Развертывание

Page 9: Golang в avito

RT Indexer

Page 10: Golang в avito

Sphinx RT Indexes• Обновление полнотекстовых данных на лету

• Демон Searchd работает одновременно на чтение и запись

• Indexer не нужен

• Обновления документов прилетают в Ram

• Заполненный Ram сбрасывается на Disk

• Старые версии перекрываются через Kill List

Page 11: Golang в avito

Инфраструктура поиска

Page 12: Golang в avito

RT indexer

Page 13: Golang в avito

RT indexer

Page 14: Golang в avito

RT indexer

Page 15: Golang в avito

Golang pipelines• https://blog.golang.org/pipelines

• Выделяем несколько воркеров • Соединяем воркеры последовательно каналами • Подаем исходные данные в первый воркер • Каждый воркер принимает данные из входящего канала • Создает свой исходящий канал и отправляет в него результат • Последний воркер не создает исходящего канала • При закрытии входящего канала воркер перекращает работу • И закрывает свой исходящий канал

Page 16: Golang в avito

RT indexer

Page 17: Golang в avito

RT indexer

Page 18: Golang в avito

RT indexer

Page 19: Golang в avito

RT indexer

Page 20: Golang в avito

RT indexer

Page 21: Golang в avito

RT indexer

Page 22: Golang в avito

RT indexer

Page 23: Golang в avito

RT indexer

Page 24: Golang в avito

RT indexer

Page 25: Golang в avito

RT indexer

Page 26: Golang в avito

RT indexer

Page 27: Golang в avito

RT indexer

Page 28: Golang в avito

RT Indexer, производительность

• До 500 rps для обновлений, в пике до 1000 rps

• Поисковая нагрузка - 17000 rps

Page 29: Golang в avito

Производительность на запись

Page 30: Golang в avito

Поисковая нагрузка

Page 31: Golang в avito

Отставание от Replica

Page 32: Golang в avito

Go в отделе QA

Page 33: Golang в avito

Bash Bash Bash

Как было раньше

Server 1 Server 2 Server N

Page 34: Golang в avito

Что хотелось получить

• Единая входная точка

• Система хранения результатов выполнения

• Честная очередь выполнения

Page 35: Golang в avito

Что получилось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

Page 36: Golang в avito

Общие модели запросов и ответов в структурах

• Валидация по типам

• Описания полей структуры к полям json экономят время

Page 37: Golang в avito

Воркеры в goroutines

• Доставка управляющих сообщений по отдельному каналу

• Единая система хранения результатов припроблемах с доставкой

Worker Manager

Worker1 … WorkerN

Page 38: Golang в avito

Радость при реализации Json RPC 2.0

• Реализации batch request через goroutine

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

Page 39: Golang в avito

Что получили в итоге от Go

• Простотой язык для изучения

• Скорость разработки

• Ресурсы, используемые сервером c сервисом на Go, в десятки раз меньше чем с сервисом на PHP

Page 40: Golang в avito

Вопросы