Путь к Go на конкретном примере

38
New Generation Data Protection Powered by Acronis AnyData Technology Путь к Go на конкретном примере Аверин Сергей, Acronis

Transcript of Путь к Go на конкретном примере

Page 1: Путь к Go на конкретном примере

New Generation Data Protection Powered by Acronis AnyData Technology

Путь к Go на конкретном примереАверин Сергей, Acronis

Page 2: Путь к Go на конкретном примере

©2016 2

в цифрах

5 миллионов Более 5 млн обычных людей

доверяют компании хранить свои личные данные

500 000 Число корпоративных заказчиков из разных отраслей экономики

30 000 Обширная экосистема

из 30 000 бизнес-партнеров, среди которых 300 — ОЕМ-партнеры

150 стран Продукты компании

переведены на 18 языков, пользуются ими

в 150 странах мира

750 человек 750 сотрудников, 23 офиса по всему

миру, среди сотрудников компании более 350 инженеров

высшего класса

45 наград Авторитетные издания не раз

признавали продукты компании лучшими на рынке

Домашниепользователи

Корпоративные клиенты

Партнеры

География Сотрудники Признание

Page 3: Путь к Go на конкретном примере

Нужен микросервис для хранения и обновления инфы об инфраструктуре

Page 4: Путь к Go на конкретном примере

©2016 4

Python-way

1) Хотим python 3.5, async/await, asyncio

2) Все это должно работать с AMQP (RabbitMQ)

3) Должна быть поддержка MySQL, PostgreSQL, MSSQL и SQlite

4) Основной костяк людей хорошо знает Tornado framework

Page 5: Путь к Go на конкретном примере

©2016 5

Python-way

Tornado framework

Page 6: Путь к Go на конкретном примере

©2016 6

Python-way

Tornado framework

−Нет поддержки async/await

Page 7: Путь к Go на конкретном примере

©2016 7

Python-way

Tornado framework

−Нет поддержки async/await

−Нет масштабирования по тредам/процессам

Page 8: Путь к Go на конкретном примере

©2016 8

Python-way

Tornado framework

−Нет поддержки async/await

−Нет масштабирования по тредам/процессам

−Сложные синхронные процедуры (вычисления) тормозят единственный тред

Page 9: Путь к Go на конкретном примере

©2016 9

Python-way

Tornado framework

−Нет поддержки async/await

−Нет масштабирования по тредам/процессам

−Сложные синхронные процедуры (вычисления) тормозят единственный тред

+ Есть стандартная библиотека AMQP-клиента

Page 10: Путь к Go на конкретном примере

©2016 10

Python-way

Tornado framework

−Нет поддержки async/await

−Нет масштабирования по тредам/процессам

−Сложные синхронные процедуры (вычисления) тормозят единственный тред

+ Есть стандартная библиотека AMQP-клиента

Page 11: Путь к Go на конкретном примере

©2016 11

Python-way

Tornado framework

−Нет поддержки async/await

−Нет масштабирования по тредам/процессам

−Сложные синхронные процедуры (вычисления) тормозят единственный тред

+ Есть стандартная библиотека AMQP-клиента

Page 12: Путь к Go на конкретном примере

©2016 12

Python-way

Tornado framework

−Нет поддержки async/await

−Нет масштабирования по тредам/процессам

−Сложные синхронные процедуры (вычисления) тормозят единственный тред

+ Есть стандартная библиотека AMQP-клиента

Page 13: Путь к Go на конкретном примере

©2016 13

Python-way

Tornado framework

−Нет поддержки async/await

−Нет масштабирования по тредам/процессам

−Сложные синхронные процедуры (вычисления) тормозят единственный тред

+ Есть стандартная библиотека AMQP-клиента

Page 14: Путь к Go на конкретном примере

©2016 14

Python-way

Page 15: Путь к Go на конкретном примере

©2016 15

Python-way

Page 16: Путь к Go на конкретном примере

©2016 16

Python-way: Тесты RPS

На одном Macbook Pro 15”: RabbitMQ, клиент, сервер

100 000 запросов

Сервер: 1 процесс, 1 воркер-тред, QOS=1, 1 коннект к базе

223 RPS

Page 17: Путь к Go на конкретном примере

©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

Page 18: Путь к Go на конкретном примере

©2016 18

Python-way

…почему так мало?

Page 19: Путь к Go на конкретном примере

©2016 19

Python-way

…почему так мало?

• Выключаем всякие special фичи AMQP

Page 20: Путь к Go на конкретном примере

©2016 20

Python-way

…почему так мало?

• Выключаем всякие special фичи AMQP

• А БД-то синхронная!

Page 21: Путь к Go на конкретном примере

©2016 21

Python-way

…почему так мало?

• Выключаем всякие special фичи AMQP

• А БД-то синхронная! Async Postgres client, пока, SQLAlchemy…

Page 22: Путь к Go на конкретном примере

©2016 22

Python-way

…почему так мало?

• Выключаем всякие special фичи AMQP

• А БД-то синхронная! Async Postgres client, пока, SQLAlchemy…

• перспектива с поддержкой async MySQL, MSSQL и SQlite

Page 23: Путь к Go на конкретном примере

©2016 23

Python-way

…почему так мало?

• Выключаем всякие special фичи AMQP

• А БД-то синхронная! Async Postgres client, пока, SQLAlchemy…

• перспектива с поддержкой async MySQL, MSSQL и SQlite

• выжимаем 585 RPS… а можно ли больше?

Page 24: Путь к Go на конкретном примере

©2016 24

Python-way

Итого, плюсы:

+Известный популярный язык без сюрпризов

+Код бизнес-логики приятен и понятен

+Удобно валидируются и конвертятся данные, приходящие в JSON

Page 25: Путь к Go на конкретном примере

©2016 25

Python-way

Итого, минусы:

−Asyncio ядро не любит долгих тупняков

−Вся асинхронщина реализуется кодом на Python -> глубокий стек, трудно дебажить

−Война промисов-корутин-коллбеков

−Надо написать свой обвязочно-костыльный асинхронный фреймворк чтобы оно заработало

Page 26: Путь к Go на конкретном примере

©2016 26

Python-way

?

Page 27: Путь к Go на конкретном примере

©2016 27

Python-way

?…а давайте попробуем на каком-нть другом языке?

Page 28: Путь к Go на конкретном примере

Про Go

Page 29: Путь к Go на конкретном примере

©2016 29

Go-way

Что изначально понравилось:

• Простой и немногословный синтаксис

• Язык заставляет делать хорошую архитектуру

• Вся асинхронщина «просто работает»

• Есть package-manager из коробки

• Есть хорошая документация

• Есть единый универсальный SQL-package

Page 30: Путь к Go на конкретном примере

©2016 30

Go-way

С чем пришлось повозиться:

• Чуть более сложный маппинг структур в SQL

• Не нашлось библиотеки по приведению типов (маршаллинг), пришлось написать самостоятельно

• Дольше подбор существующих библиотек под задачи

• Мелкие глюки отдельных библиотек, типа SQL BIT поля читаются как 0x31/0x30

• Логирование из коробки так себе

Page 31: Путь к Go на конкретном примере

©2016 31

Go-way

Page 32: Путь к Go на конкретном примере

©2016 32

Go-way

Page 33: Путь к Go на конкретном примере

©2016 33

Go-way

Делаем простенький однопоточный сервис в 1 файл.

1 горутина, AMQP QOS = 1, 1 коннект к базе

1063 RPS

Page 34: Путь к Go на конкретном примере

©2016 34

Go-way

Делаем простенький однопоточный сервис в 1 файл.

1 горутина, AMQP QOS = 1, 1 коннект к базе

1063 RPS

Переписали на нормальный код, получили рабочий сервис

и ~1087 RPS (и никакие оптимизации уже не помогали)

Page 35: Путь к Go на конкретном примере

©2016 35

Go-way

Итого, плюсы:

+ Если сравнивать с C++, то сильно проще и менее бажно

+Все асинхронное и удобное из коробки

+Работает быстрее Python в нашей практике, даже всего при 2 горутинах

Page 36: Путь к Go на конкретном примере

©2016 36

Go-way

Итого, минусы:

−Дебажить сложнее, и не все видно

−Строгая типизация (еще и машинно-зависимая) — больше мучений чем хотелось бы

−Код усеивается конструкциями if (error != nil) { panic(…); }

−Жаль, синтаксис весьма скуден

Page 37: Путь к Go на конкретном примере

©2016 37

Спасибо! Вопросы?

Аверин Сергей

twitter.com/[email protected] averin.ru/slides/

facebook.com/ryba.xek

Page 38: Путь к Go на конкретном примере

acronis.com

blog.acronis.com twitter.com/acronis facebook.com/acronis

New Generation Data Protection Powered by Acronis AnyData Technology