SlideShare a Scribd company logo
Golang – опыт промышленной
разработки
Три года в бою
Васияров Юрий
SVP Engineering
Lazada Group
О компании Lazada
• Основана в 2012 году
• Крупнейшая e-commerce компания
Юго-Восточной Азии
• Работает в 6 странах Юго-Восточной
Азии с суммарным населением 650M
человек
• Более 40 миллионов продуктов
• 1.2M товаров за время последней
распродажи (3 дня)
• С 2016 года является частью Alibaba
Group
2
Инфраструктура
3 Датацентра
1500+ серверов
10K+ rps на сервер
3
Команда Lazada
• 4 TechHub: Вьетнам,
Сингапур, Бангкок,
Москва
• Более 650 инженеров
• Разработка платформы
только на Golan
• 90% платформы
разрабатывается в
Москве
• Более 100 Golang
программистов в
московской команде
4
Почему именно Golang ?
5.5 часов 2.5 часа 30 минут 2-3 минуты
5
Оптимизации
PHP
2x 5x 10x
Параллелизация
Оптимизация
Go кода
История одной оптимизации
Проект Goblin
80 серверов 20 серверов
6
Но где взять Golang программистов ?
7
Какой фреймворк использовать ?
• Echo - https://github.com/labstack/echo
• kit - https://github.com/go-kit/kit
• go-micro - https://github.com/micro/go-micro
8
Фреймворк
9
Наш фреймворк - Brick
• Роутинг: gorilla/mux
• Транспорт: REST/RPC, grpc
• Dependency injection: github.com/
tsaikd/inject
• Логгирование: небольшая обертка
вокруг unixgram
• Мониторинг: обертка вокруг
Prometheus клиента
• Работа с базой данных: gorp
• Юнит тесты: github.com/stretchr/
testify или https://github.com/go-
check/check
10
Документирование - Swagger
• Swagger описание
генерируется
автоматически при
помощи рефлексии
• Также используется для
расчета покрытия
функциональными
тестами
• github.com/lazada/
swgen
• github.com/lazada/swgui
11
Профилирование
• Простой интерфейс для запуска/остановки профайлера
• Автоотключение через 5 минут
• Удобная возможность скачать профайл вместе с бинарным
файлом
• Активно используется в production
github.com/lazada/goprof
12
Профилирование - Go Torch
https://github.com/uber/go-torch
13
kcachegrind
14
go tool pprof -callgrind -output callgrind.out ~/xxx_api ~/cpu-
profile
Типичные ошибки
15
Циклические зависимости между пакетами
16
Package A
Package B
Циклические зависимости
• Не усложняйте
• Пакеты должны быть самодостаточными
• Взаимодействие между пакетами - только через
интерфейсы
https://peter.bourgon.org/go-in-production/
17
Сокрытие переменных
18
Кэширование в памяти
• Отдельный кэш для каждого экземпляра приложения. Меньше попаданий
в кэш
• Должен быть ограничен по размеру
• Вытеснение также должно работать за O(1)
• Внутренние блокировки
• Кэширование ссылочных структур данных приводит к race condition
Может быть полезен:
github.com/lazada/go-copy-interfaces
19
map[]
map[] - это честный hash table
Является неупорядоченным
20
Передача аргументов - указатели
21
Передача аргументов - указатели
22
Race conditions
• Go race detector прекрасен
• Но медленный (2-20x)
• Ограничение на 8192 goroutines.
Нигде не документировано
23
Неуправляемые горутины
Все отлично работает в 99% случаев
24
database/sql
• Когда создается подключение ?
• Когда оно закрывается ?
• А сколько вообще этих подключений ?
• А есть ли ограничение на максимальное количество
соединений ?
• А что случится если в пуле не будет свободных
соединений ?
• А что если SQL сервер закроет соединение ?
sql.DB - это пул соединений
25
Утечка соединений
26
PS
Никогда так не пишите :-)
К чему приводят утечки соединений
27
Типичные ошибки при работе с database/sql
• Использование Defer внутри цикла
• Использование нескольких sql.DB объектов
• Prepared statement используются только
однажды
• Использование db.Query() не для чтения
• Предположение о том что последующие запросы
будут использовать то же подключение
• Использование объекта sql.DB во время работы
с транзакцией
28
Статические анализаторы кода
github.com/alecthomas/gometalinter
--enable=vet --enable=vetshadow
--enable=gosimple
--enable=staticcheck
--enable=ineffassign
--enable=lll
--enable=goconst
--cyclo-over=50
--dupl-threshold=290
--enable=unconvert
--enable=unused
--enable=varcheck
--enable=dupl
29
Code style
• go fmt/goimports - не обсуждается
• go vet - не обсуждается
• Go Code Review Comments - не является обязательным
30
Как выучить Golang за 24 часа
• Golang tour - http://tour.golang.org/#1
• OOP
• Methods: a taste of OOP - http://go-book.appspot.com/methods.html
• More meth(odes) please! http://go-book.appspot.com/more-methods.html
• 50 Shades of Go - http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/
• Effective Go - http://golang.org/doc/effective_go.html
• Golang Blog
• http://blog.golang.org/slices
• http://blog.golang.org/go-slices-usage-and-internals
• http://blog.golang.org/go-maps-in-action
• http://blog.golang.org/cover
• Go Data Structures
• https://research.swtch.com/godata
• https://research.swtch.com/interfaces
• Common Pitfalls When Using database/sql in Go - https://www.vividcortex.com/blog/2015/09/22/
common-pitfalls-go/
31
Вопросы ?
Васияров Юрий,
SVP Engineering,
Lazada Group
yuriy.vasiyarov@gmail.com
https://github.com/yvasiyarov
32

More Related Content

What's hot

Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana Labs
Badoo Development
 
Be productive with Javascript in the end of 2016
Be productive with Javascript in the end of 2016 Be productive with Javascript in the end of 2016
Be productive with Javascript in the end of 2016
DataArt
 
5 особенностей при вводе в эксплуатацию веб приложения
5 особенностей при вводе в эксплуатацию веб приложения5 особенностей при вводе в эксплуатацию веб приложения
5 особенностей при вводе в эксплуатацию веб приложения
Вячеслав Сычев
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7
Alexander Levantovsky
 
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Fwdays
 
“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах
automated-testing.info
 
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Ontico
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данных
Badoo Development
 
Microservices for test automation - OK.RU expirience
Microservices for test automation - OK.RU expirienceMicroservices for test automation - OK.RU expirience
Microservices for test automation - OK.RU expirience
Nikita Makarov
 
Use of fuzz testing
Use of  fuzz testing Use of  fuzz testing
Use of fuzz testing
CaMypau
 
Watson
WatsonWatson
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Oleg Mykolaichenko
 
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий ЛевченкоPrometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Ontico
 
HappyDev-lite-2016-осень, день 2 01 Денис Нелюбин. Жизнь после релиза
HappyDev-lite-2016-осень, день 2 01 Денис Нелюбин. Жизнь после релизаHappyDev-lite-2016-осень, день 2 01 Денис Нелюбин. Жизнь после релиза
HappyDev-lite-2016-осень, день 2 01 Денис Нелюбин. Жизнь после релиза
HappyDev-lite
 
Вредные советы для разработчиков
Вредные советы для разработчиковВредные советы для разработчиков
Вредные советы для разработчиков
ITCrowd Almaty
 
Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?
Ivan Fedorov
 
Monitoring base, golang meetup, kyiv
Monitoring base, golang meetup, kyivMonitoring base, golang meetup, kyiv
Monitoring base, golang meetup, kyiv
Vsevolod Polyakov
 
CodeFest 2012. Захаров М. — Опыт разработки и внедрения решений интеграционно...
CodeFest 2012. Захаров М. — Опыт разработки и внедрения решений интеграционно...CodeFest 2012. Захаров М. — Опыт разработки и внедрения решений интеграционно...
CodeFest 2012. Захаров М. — Опыт разработки и внедрения решений интеграционно...CodeFest
 
Don't worry, do automation
Don't worry, do automationDon't worry, do automation
Don't worry, do automation
Vitebsk Miniq
 

What's hot (20)

Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana Labs
 
Be productive with Javascript in the end of 2016
Be productive with Javascript in the end of 2016 Be productive with Javascript in the end of 2016
Be productive with Javascript in the end of 2016
 
5 особенностей при вводе в эксплуатацию веб приложения
5 особенностей при вводе в эксплуатацию веб приложения5 особенностей при вводе в эксплуатацию веб приложения
5 особенностей при вводе в эксплуатацию веб приложения
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7
 
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
 
“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах
 
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали Групон
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данных
 
Microservices for test automation - OK.RU expirience
Microservices for test automation - OK.RU expirienceMicroservices for test automation - OK.RU expirience
Microservices for test automation - OK.RU expirience
 
Use of fuzz testing
Use of  fuzz testing Use of  fuzz testing
Use of fuzz testing
 
Watson
WatsonWatson
Watson
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
 
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий ЛевченкоPrometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий Левченко
 
HappyDev-lite-2016-осень, день 2 01 Денис Нелюбин. Жизнь после релиза
HappyDev-lite-2016-осень, день 2 01 Денис Нелюбин. Жизнь после релизаHappyDev-lite-2016-осень, день 2 01 Денис Нелюбин. Жизнь после релиза
HappyDev-lite-2016-осень, день 2 01 Денис Нелюбин. Жизнь после релиза
 
Вредные советы для разработчиков
Вредные советы для разработчиковВредные советы для разработчиков
Вредные советы для разработчиков
 
Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?
 
Monitoring base, golang meetup, kyiv
Monitoring base, golang meetup, kyivMonitoring base, golang meetup, kyiv
Monitoring base, golang meetup, kyiv
 
CodeFest 2012. Захаров М. — Опыт разработки и внедрения решений интеграционно...
CodeFest 2012. Захаров М. — Опыт разработки и внедрения решений интеграционно...CodeFest 2012. Захаров М. — Опыт разработки и внедрения решений интеграционно...
CodeFest 2012. Захаров М. — Опыт разработки и внедрения решений интеграционно...
 
Don't worry, do automation
Don't worry, do automationDon't worry, do automation
Don't worry, do automation
 

Similar to Стачка 2017: Golang – опыт промышленной разработки

D2D DevPro 2017: Golang — опыт промышленной разработки
D2D DevPro 2017: Golang — опыт промышленной разработкиD2D DevPro 2017: Golang — опыт промышленной разработки
D2D DevPro 2017: Golang — опыт промышленной разработки
Yuriy Vasiyarov
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Ontico
 
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Ontico
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
2ГИС Технологии
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
Sergey Xek
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Ontico
 
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Top-10  популярных вопросов администраторам баз данных или почему я против св...Top-10  популярных вопросов администраторам баз данных или почему я против св...
Top-10 популярных вопросов администраторам баз данных или почему я против св...Ilya Kosmodemiansky
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
Ontico
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
HappyDev
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
Nikolay Samokhvalov
 
DevOps или искусство выживания в растущей компании
DevOps или искусство выживания в растущей компанииDevOps или искусство выживания в растущей компании
DevOps или искусство выживания в растущей компании
Alexey Vakhov
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.
Yury Bushmelev
 
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Ontico
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
e-Legion
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011CodeCamp
 
AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...
AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...
AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...
JSC “Arcadia Inc”
 

Similar to Стачка 2017: Golang – опыт промышленной разработки (20)

D2D DevPro 2017: Golang — опыт промышленной разработки
D2D DevPro 2017: Golang — опыт промышленной разработкиD2D DevPro 2017: Golang — опыт промышленной разработки
D2D DevPro 2017: Golang — опыт промышленной разработки
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
 
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
 
Little Service in 2h
Little Service in 2hLittle Service in 2h
Little Service in 2h
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Top-10  популярных вопросов администраторам баз данных или почему я против св...Top-10  популярных вопросов администраторам баз данных или почему я против св...
Top-10 популярных вопросов администраторам баз данных или почему я против св...
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
DevOps или искусство выживания в растущей компании
DevOps или искусство выживания в растущей компанииDevOps или искусство выживания в растущей компании
DevOps или искусство выживания в растущей компании
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.
 
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...
AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...
AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...
 

Стачка 2017: Golang – опыт промышленной разработки

  • 1. Golang – опыт промышленной разработки Три года в бою Васияров Юрий SVP Engineering Lazada Group
  • 2. О компании Lazada • Основана в 2012 году • Крупнейшая e-commerce компания Юго-Восточной Азии • Работает в 6 странах Юго-Восточной Азии с суммарным населением 650M человек • Более 40 миллионов продуктов • 1.2M товаров за время последней распродажи (3 дня) • С 2016 года является частью Alibaba Group 2
  • 4. Команда Lazada • 4 TechHub: Вьетнам, Сингапур, Бангкок, Москва • Более 650 инженеров • Разработка платформы только на Golan • 90% платформы разрабатывается в Москве • Более 100 Golang программистов в московской команде 4
  • 5. Почему именно Golang ? 5.5 часов 2.5 часа 30 минут 2-3 минуты 5 Оптимизации PHP 2x 5x 10x Параллелизация Оптимизация Go кода История одной оптимизации
  • 7. Но где взять Golang программистов ? 7
  • 8. Какой фреймворк использовать ? • Echo - https://github.com/labstack/echo • kit - https://github.com/go-kit/kit • go-micro - https://github.com/micro/go-micro 8
  • 10. Наш фреймворк - Brick • Роутинг: gorilla/mux • Транспорт: REST/RPC, grpc • Dependency injection: github.com/ tsaikd/inject • Логгирование: небольшая обертка вокруг unixgram • Мониторинг: обертка вокруг Prometheus клиента • Работа с базой данных: gorp • Юнит тесты: github.com/stretchr/ testify или https://github.com/go- check/check 10
  • 11. Документирование - Swagger • Swagger описание генерируется автоматически при помощи рефлексии • Также используется для расчета покрытия функциональными тестами • github.com/lazada/ swgen • github.com/lazada/swgui 11
  • 12. Профилирование • Простой интерфейс для запуска/остановки профайлера • Автоотключение через 5 минут • Удобная возможность скачать профайл вместе с бинарным файлом • Активно используется в production github.com/lazada/goprof 12
  • 13. Профилирование - Go Torch https://github.com/uber/go-torch 13
  • 14. kcachegrind 14 go tool pprof -callgrind -output callgrind.out ~/xxx_api ~/cpu- profile
  • 16. Циклические зависимости между пакетами 16 Package A Package B
  • 17. Циклические зависимости • Не усложняйте • Пакеты должны быть самодостаточными • Взаимодействие между пакетами - только через интерфейсы https://peter.bourgon.org/go-in-production/ 17
  • 19. Кэширование в памяти • Отдельный кэш для каждого экземпляра приложения. Меньше попаданий в кэш • Должен быть ограничен по размеру • Вытеснение также должно работать за O(1) • Внутренние блокировки • Кэширование ссылочных структур данных приводит к race condition Может быть полезен: github.com/lazada/go-copy-interfaces 19
  • 20. map[] map[] - это честный hash table Является неупорядоченным 20
  • 23. Race conditions • Go race detector прекрасен • Но медленный (2-20x) • Ограничение на 8192 goroutines. Нигде не документировано 23
  • 24. Неуправляемые горутины Все отлично работает в 99% случаев 24
  • 25. database/sql • Когда создается подключение ? • Когда оно закрывается ? • А сколько вообще этих подключений ? • А есть ли ограничение на максимальное количество соединений ? • А что случится если в пуле не будет свободных соединений ? • А что если SQL сервер закроет соединение ? sql.DB - это пул соединений 25
  • 27. К чему приводят утечки соединений 27
  • 28. Типичные ошибки при работе с database/sql • Использование Defer внутри цикла • Использование нескольких sql.DB объектов • Prepared statement используются только однажды • Использование db.Query() не для чтения • Предположение о том что последующие запросы будут использовать то же подключение • Использование объекта sql.DB во время работы с транзакцией 28
  • 29. Статические анализаторы кода github.com/alecthomas/gometalinter --enable=vet --enable=vetshadow --enable=gosimple --enable=staticcheck --enable=ineffassign --enable=lll --enable=goconst --cyclo-over=50 --dupl-threshold=290 --enable=unconvert --enable=unused --enable=varcheck --enable=dupl 29
  • 30. Code style • go fmt/goimports - не обсуждается • go vet - не обсуждается • Go Code Review Comments - не является обязательным 30
  • 31. Как выучить Golang за 24 часа • Golang tour - http://tour.golang.org/#1 • OOP • Methods: a taste of OOP - http://go-book.appspot.com/methods.html • More meth(odes) please! http://go-book.appspot.com/more-methods.html • 50 Shades of Go - http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/ • Effective Go - http://golang.org/doc/effective_go.html • Golang Blog • http://blog.golang.org/slices • http://blog.golang.org/go-slices-usage-and-internals • http://blog.golang.org/go-maps-in-action • http://blog.golang.org/cover • Go Data Structures • https://research.swtch.com/godata • https://research.swtch.com/interfaces • Common Pitfalls When Using database/sql in Go - https://www.vividcortex.com/blog/2015/09/22/ common-pitfalls-go/ 31
  • 32. Вопросы ? Васияров Юрий, SVP Engineering, Lazada Group yuriy.vasiyarov@gmail.com https://github.com/yvasiyarov 32