Путь к Go на конкретном примере
-
Upload
sergey-xek -
Category
Software
-
view
443 -
download
1
Transcript of Путь к Go на конкретном примере
New Generation Data Protection Powered by Acronis AnyData Technology
Путь к Go на конкретном примереАверин Сергей, Acronis
©2016 2
в цифрах
5 миллионов Более 5 млн обычных людей
доверяют компании хранить свои личные данные
500 000 Число корпоративных заказчиков из разных отраслей экономики
30 000 Обширная экосистема
из 30 000 бизнес-партнеров, среди которых 300 — ОЕМ-партнеры
150 стран Продукты компании
переведены на 18 языков, пользуются ими
в 150 странах мира
750 человек 750 сотрудников, 23 офиса по всему
миру, среди сотрудников компании более 350 инженеров
высшего класса
45 наград Авторитетные издания не раз
признавали продукты компании лучшими на рынке
Домашниепользователи
Корпоративные клиенты
Партнеры
География Сотрудники Признание
Нужен микросервис для хранения и обновления инфы об инфраструктуре
©2016 4
Python-way
1) Хотим python 3.5, async/await, asyncio
2) Все это должно работать с AMQP (RabbitMQ)
3) Должна быть поддержка MySQL, PostgreSQL, MSSQL и SQlite
4) Основной костяк людей хорошо знает Tornado framework
©2016 5
Python-way
Tornado framework
©2016 6
Python-way
Tornado framework
−Нет поддержки async/await
©2016 7
Python-way
Tornado framework
−Нет поддержки async/await
−Нет масштабирования по тредам/процессам
©2016 8
Python-way
Tornado framework
−Нет поддержки async/await
−Нет масштабирования по тредам/процессам
−Сложные синхронные процедуры (вычисления) тормозят единственный тред
©2016 9
Python-way
Tornado framework
−Нет поддержки async/await
−Нет масштабирования по тредам/процессам
−Сложные синхронные процедуры (вычисления) тормозят единственный тред
+ Есть стандартная библиотека AMQP-клиента
©2016 10
Python-way
Tornado framework
−Нет поддержки async/await
−Нет масштабирования по тредам/процессам
−Сложные синхронные процедуры (вычисления) тормозят единственный тред
+ Есть стандартная библиотека AMQP-клиента
©2016 11
Python-way
Tornado framework
−Нет поддержки async/await
−Нет масштабирования по тредам/процессам
−Сложные синхронные процедуры (вычисления) тормозят единственный тред
+ Есть стандартная библиотека AMQP-клиента
©2016 12
Python-way
Tornado framework
−Нет поддержки async/await
−Нет масштабирования по тредам/процессам
−Сложные синхронные процедуры (вычисления) тормозят единственный тред
+ Есть стандартная библиотека AMQP-клиента
©2016 13
Python-way
Tornado framework
−Нет поддержки async/await
−Нет масштабирования по тредам/процессам
−Сложные синхронные процедуры (вычисления) тормозят единственный тред
+ Есть стандартная библиотека AMQP-клиента
©2016 14
Python-way
©2016 15
Python-way
©2016 16
Python-way: Тесты RPS
На одном Macbook Pro 15”: RabbitMQ, клиент, сервер
100 000 запросов
Сервер: 1 процесс, 1 воркер-тред, QOS=1, 1 коннект к базе
223 RPS
©2016 17
Python-way: Тесты RPS
На одном Macbook Pro 15”: RabbitMQ, клиент, сервер
100 000 запросов
Сервер: 1 процесс, 1 воркер-тред, QOS=1, 1 коннект к базе
223 RPS
1 процесс, 32 воркер-треда, QOS=32, 16 коннектов к базе
301 RPS
©2016 18
Python-way
…почему так мало?
©2016 19
Python-way
…почему так мало?
• Выключаем всякие special фичи AMQP
©2016 20
Python-way
…почему так мало?
• Выключаем всякие special фичи AMQP
• А БД-то синхронная!
©2016 21
Python-way
…почему так мало?
• Выключаем всякие special фичи AMQP
• А БД-то синхронная! Async Postgres client, пока, SQLAlchemy…
©2016 22
Python-way
…почему так мало?
• Выключаем всякие special фичи AMQP
• А БД-то синхронная! Async Postgres client, пока, SQLAlchemy…
• перспектива с поддержкой async MySQL, MSSQL и SQlite
©2016 23
Python-way
…почему так мало?
• Выключаем всякие special фичи AMQP
• А БД-то синхронная! Async Postgres client, пока, SQLAlchemy…
• перспектива с поддержкой async MySQL, MSSQL и SQlite
• выжимаем 585 RPS… а можно ли больше?
©2016 24
Python-way
Итого, плюсы:
+Известный популярный язык без сюрпризов
+Код бизнес-логики приятен и понятен
+Удобно валидируются и конвертятся данные, приходящие в JSON
©2016 25
Python-way
Итого, минусы:
−Asyncio ядро не любит долгих тупняков
−Вся асинхронщина реализуется кодом на Python -> глубокий стек, трудно дебажить
−Война промисов-корутин-коллбеков
−Надо написать свой обвязочно-костыльный асинхронный фреймворк чтобы оно заработало
©2016 26
Python-way
?
©2016 27
Python-way
?…а давайте попробуем на каком-нть другом языке?
Про Go
©2016 29
Go-way
Что изначально понравилось:
• Простой и немногословный синтаксис
• Язык заставляет делать хорошую архитектуру
• Вся асинхронщина «просто работает»
• Есть package-manager из коробки
• Есть хорошая документация
• Есть единый универсальный SQL-package
©2016 30
Go-way
С чем пришлось повозиться:
• Чуть более сложный маппинг структур в SQL
• Не нашлось библиотеки по приведению типов (маршаллинг), пришлось написать самостоятельно
• Дольше подбор существующих библиотек под задачи
• Мелкие глюки отдельных библиотек, типа SQL BIT поля читаются как 0x31/0x30
• Логирование из коробки так себе
©2016 31
Go-way
©2016 32
Go-way
©2016 33
Go-way
Делаем простенький однопоточный сервис в 1 файл.
1 горутина, AMQP QOS = 1, 1 коннект к базе
1063 RPS
©2016 34
Go-way
Делаем простенький однопоточный сервис в 1 файл.
1 горутина, AMQP QOS = 1, 1 коннект к базе
1063 RPS
Переписали на нормальный код, получили рабочий сервис
и ~1087 RPS (и никакие оптимизации уже не помогали)
©2016 35
Go-way
Итого, плюсы:
+ Если сравнивать с C++, то сильно проще и менее бажно
+Все асинхронное и удобное из коробки
+Работает быстрее Python в нашей практике, даже всего при 2 горутинах
©2016 36
Go-way
Итого, минусы:
−Дебажить сложнее, и не все видно
−Строгая типизация (еще и машинно-зависимая) — больше мучений чем хотелось бы
−Код усеивается конструкциями if (error != nil) { panic(…); }
−Жаль, синтаксис весьма скуден
©2016 37
Спасибо! Вопросы?
Аверин Сергей
twitter.com/[email protected] averin.ru/slides/
facebook.com/ryba.xek
acronis.com
blog.acronis.com twitter.com/acronis facebook.com/acronis
New Generation Data Protection Powered by Acronis AnyData Technology