Всем привет! Это мой первый пост здесь. Решил выложить свой перевод статьи Tigranа Bayburtsyanа о том, как он и его стартап перешли с Python на Go. Статья мне показалась интересной, на medium она находится в топ-3 по тегу golang с начала этого года. Сразу скажу, она лишь отражает мнение и опыт автора, которые могут не совпадать с вашими, и это нормально — сколько людей столько и мнений. Итак, поехали.
Gophers с сайта golang.org
Python прекрасен! Особенно Python 3 с его асинхронной функциональностью. Но на деле Go не даёт никому шансов выжить в мире enterprise…
Если вы прониклись этой цитатой, тогда вы, возможно, пробовали или хотя бы смотрели в сторону языка программирования Go, который, по моему мнению, является самым простым языком программирования, подходящим для разработки любых приложений. Да! Вы не ослышались, для меня изучить Go оказалось проще, чем Javascript. Я думаю, это главная причина того, что Go разошёлся такой популярностью всего за несколько лет.
Итак, что мы имели перед использованием Go?
TreeScale.com — это, в основном, панель инструментов и приложение, основанное на API, с некоторыми аналитическими возможностями. Вот наш технологический стек:
- React.js для клиентской части панели инструментов
- Django (Python) для серверной части панели инструментов + сервис аутентификации
- Node.js для API сервиса
- PostgreSQL как база данных и Cassandra для логирования
- Самописные реестры для контейнеров на языке Rust
Как вы можете видеть, вся инфраструктура — полностью основана на микросервисах, и большая часть логики полностью разделена, даже на разные технологии.
Это основная причина, почему мы начали размышлять о слиянии API сервиса и серверной части в единый проект, потому что у них есть много схожих вещей, в то время как код приходится повторять на множестве различных языков и технологий. Но, как оказалось, нам пришлось бы совершать много лишних телодвижений по настройке API сервиса Django, особенно с пользовательскими JSON ответами.
После 1 месяца создания API сервиса на Django, я почувствовал, что Django крут только пока вы делаете что-то обыденное, но когда вы хотите больше производительности и настраиваемых модулей — это становится куда более сложным делом.
Почему Go?
Как я говорил ранее, Go — самый простой язык, который я когда-либо видел и использовал до этого. Но это было лишь начало.
Вот 5 основных причин, почему мы перешли с Python Django в пользу Go.
#1 Он компилируется в единый бинарник
Goland создан как компилируемый язык, и команда разработчиков Google проделала большую работу над ним. Используя статичное связывание (static linking) он действительно объединяет все зависимости библиотек и модулей в единый бинарный файл, основанный на типе и архитектуре используемой операционной системы. Это значит, если вы компилируете серверную часть своего приложения на своём ноутбуке под linux x86 CPU, то вы можете просто загрузить скомпилированный бинарник на сервер и это будет работать, без установки каких-либо зависимостей на нём!
#2 Система статических типов
Система типов это действительно важная часть большого масштабируемого приложения. Python крутой и интересный язык, но иногда вы просто получаете нестандартные исключения, потому что пытаетесь использовать переменные как число (integer), но оказывается, что это строка (string).
# Django will crash process because of this
def some_view(request):
user_id = request.POST.get('id', 0)
# If this post request has "id" parameter then
# user_id would be a string,
# but you really thinking it is integer
User.objects.get(id=user_id)
Go даст вам знать об этой проблеме во время компиляции, путём вывода ошибки компилятора. Это тот момент, когда вы выигрываете время, вместо того, что тратить его на такие глупые ошибки.
#3 Производительность!!
Это возможно вас удивит, но во многих случаях Go быстрее Python (2 и 3). Вот результаты
тестов игр, которые, тем не менее, являются несправедливыми, так как зависят от типа приложения и конкретного случая.
В нашем случае, Go производительнее благодаря своей модели параллелизма и масштабируемости CPU. Всякий раз, когда нам необходимо обработать внутренний запрос, мы делаем это с помощью отдельной Горутины, которая в 10 раз менее прожорлива, чем потоки в Python. Таким образом, мы сохраняем много ресурсов (память, CPU), потому что используем встроенные функции языка.
#4 Вам не нужен фреймворк для Go
Это наиболее крутая штука в этом языке программирование. Создатели Go и его сообщество сделали так много встроенных инструментов, которые в самом языке поставляются «из коробки», что в большинстве случаев отпадает необходимость в какой-либо сторонней библиотеке. Например, в нём есть http, json, html templating, изначально встроенные в язык, тем самым вы можете создавать сложные API сервисы даже не думая о поиске какой-либо библиотеке на Github!
Но конечно, есть и множество библиотек и фреймворков, написанных для Go и для создания веб-приложений на нём, но я рекомендую вам самим создавать ваше приложение или API сервис без использования сторонних библиотек, потому что в большинстве случаев они не сделают вашу жизнь проще, как это делают встроенные пакеты.
#5 Отличная поддержка IDE и отладка
Поддержка IDE это одна из самых важных вещей, когда вы пытаетесь перейти на другой язык программирования. Комфортная IDE в среднем может сохранить до 80% вашего времени написания кода. Я нашёл плагин Go для JetBrains IDEA, который также поддерживает WebStorm, PHPStorm и так далее. Этот плагин предоставляет всё, что необходимо для разработки проекта; со всей мощью JetBrains IDEA вы можете реально ускорить свою разработку.
Основываясь на нашей статистике кода, после переписывания всех проектов на Go мы получили на 64% меньше кода, чем раньше.
Вам действительно не нужно отлаживать код, которого не существует. Меньше кода, меньше проблем!
Заключение
Go дал нам большую гибкость, единый язык для всех случаев и во всех из них, он работает очень и очень хорошо. Мы получили на 30% больше производительности нашей серверной части и API сервисов. И теперь мы можем обрабатывать логи в режиме реального времени, перемещать его в базу данных и создавать потоки на Websocket из одного или нескольких сервисов. Это потрясающий результат возможностей языка Go.
Автор: Барак Адама