📱 Выбираем хостинг для мобильного приложения. Часть третья: Node.js и Go – преимущества и недостатки
Серверные языки программирования и среды исполнения различаются по многим аспектам, что делает процесс выбора для конкретного случая довольно сложным. Сравним преимущества и недостатки Node.js и Go – двух популярных среди разработчиков всего мира вариантов. Попробуем разобраться, какой из них лучше.
В предыдущих частях написанного совместно с Selectel цикла статей мы рассмотрели варианты мобильных приложений, протоколы сетевого взаимодействия, системы баз данных и инструменты кэширования. Это дало нам базовое представление о требованиях к процессору, оперативной памяти и дисковой подсистеме сервера.
Чтобы помочь вам сделать правильный выбор, мы сосредоточимся на двух вариантах: Go и Node.js. В последнее время они наиболее активно развиваются и являются наиболее многообещающими серверными технологиями.
Другие статьи цикла:
Node.js
Node.js – это кроссплатформенная среда исполнения JavaScript с открытым исходным кодом, которая часто используется для создания сетевых сервисов. Node.js характеризуется легкой кривой обучения, которая позволяет создавать быстрые и масштабируемые приложения на JavaScript – эта среда отлично подходит для быстрого прототипирования и отличается изобилием библиотек с открытым исходным кодом.
Как появился Node.js
История Node.js начинается с JavaScript, одного из самых любимых языков программирования всех времен. JavaScript был создан в 1995 году и в то время использовался исключительно для веб-разработки, но применять его исключительно как язык программирования сценариев на стороне клиента было бы непрактично.
Node.js подходит для выполнения кода на серверной стороне, в нем есть несколько модулей, которые предоставляют JavaScript возможности, необходимые для мобильных, настольных и серверных приложений. Таким образом Node.js позволил программистам использовать свой любимый JavaScript не только для интерактивной веб-разработки, но и для других целей!
Для чего используется Node.js
Node.js идеально подходит для масштабируемых, ресурсоемких и даже для приложений реального времени. Это связано с неблокирующей асинхронной природой среды. Что это значит? В Node.js один поток предназначен для обслуживания нескольких запросов. Когда поступает запрос, для его обработки используется один поток. Если нам нужно обратиться к базе данных для получения ответа, поток не ждет ответа от базы данных. Скорее он переходит к другим запросам, и когда база данных готова вернуть данные, она помещает их в очередь событий. Очередь постоянно контролируется Node.js, поэтому клиенты обслуживаются непрерывно.
Благодаря неблокирующим асинхронным алгоритмам работы Node.js идеально подходит для приложений с интенсивным использованием данных, приложений с высокими требованиями к масштабируемости и приложений, требующих высокой производительности в течение всего срока службы.
Go
Go (GoLang) – это статически типизированный компилируемый язык программирования с открытым исходным кодом, включающий сборщик мусора. Он чрезвычайно быстр (приложения на Go компилируются сразу в машинный код) и эффективен, поскольку построен с использованием языка C. Разработчики Go определенно не страдают от крутой кривой обучения.
Как появился язык программирования Go
Язык Go был создан в Google примерно в 2008 – 2009 годах, чтобы помочь технологическому гиганту решить конкретные проблемы того времени. Среди них можно выделить разработку многопоточных, сетевых приложений и веб-сервисов. По словам создателей GoLang (Кен Томпсон, Роберт Гриземер и Роб Пайк), старые языки не решали, а обходили современные проблемы. Таким образом они придумали новое решение, адаптированное к конкретным потребностям бизнеса.
Для чего используется Go
GoLang – это в основном серверный язык, хотя область его применения стремительно растет. Он был создан для решения современных технических задач, и лучше всего показывает себя в следующих областях:
- сетевое программирование;
- обработка большого количества данных;
- облачные вычисления;
- машинное обучение;
- обработка гео-данных;
- микросервисы;
- работа с потоковым аудио и видео;
- инструменты разработки.
Node.js vs Go
- GoLang – это статически типизированный язык программирования со сборкой мусора, обеспечивающий высокую производительность, а Node.js – это кроссплатформенная среда выполнения (а не язык или фреймворк). Если Go, если можно так выразиться, работает сам по себе, то Node.js на самом деле помогает JavaScript функционировать как серверный язык.
- Оба они используются во всем мире как признанные технологии. У них есть отличное сообщество и армия поклонников, их используют в крупных ИТ-компаниях, среди которых есть такие громкие названия, как Google, Netflix и PayPal. Еще одна общая черта – они используются в основном для backend-разработки.
- В то же время Node.js и Go однозначно нельзя сравнивать между собой: ни один не лучше и не хуже другого. В целом не слишком корректно навешивать на инструменты разработки ярлыки ПЛОХО или ХОРОШО, поскольку каждая технология предназначена для решения конкретных задач. Если в какой-то момент один инструмент действует «хуже», чем другой, может быть, он просто не предназначен для такого использования?
Критерий №1: зрелость
Хотя Go был представлен в 2009 году, его можно считать зрелым и надежным инструментом. В то же время Node.js демонстрирует тот же уровень зрелости и пользуется поддержкой широкой аудитории.
Итак, с точки зрения зрелости Node.js и GoLang почти одинаковы.
Критерий №2: чистая производительность
Google решил представить Go из-за разочарования специалистов в существующих языках программирования. По сравнению с Node.js, Go – лучший вариант для чистой (raw) производительности и вычислений.
С другой стороны, интерпретируемый Node.js является производным от JavaScript и, следовательно, обычно работает медленнее, чем другие языки программирования. В отличие от Go, Node.js не может предложить чистую производительность ЦП или задач, связанных с памятью. Проще говоря, Node.js может работать одинаково хорошо или ужасно, в зависимости от качества кода и специфики вашего приложения.
В сравнении производительности Go превосходит Node.js в среднем в два и более раза и помогает разработчикам добиться лучшей производительности.
Критерий №3: производительность в реальной жизни
Go показывает в два раза лучшую производительность по сравнению с Node.js даже в стандартном исполнении. Помимо того Go имеет подходы которые, позволяют получить еще большую производительность при реализации реальных задач.
Грамотное использование горутин (сопрограмм) совместно с гетерогенной архитектурой доступа к данным (база данных + кеш) или масштабированием на основе партиционирования позволяют сделать эту разницу еще более существенной.
Критерий №4: обработка ошибок
Обработка ошибок в Go требует от вас реализации явной проверки. Ошибки времени компиляции и выполнения обрабатываются по-разному, что создает сложности для разработчиков.
С другой стороны, Node.js реализует традиционный механизм обработки ошибок типа throw-catch, который довольно популярен среди программистов. При таком традиционном подходе ошибки отображаются и исправляются непосредственно перед исполнением следующих операций.
Сравнивая механизм обработки ошибок GoLang и Node.js, многие веб-разработчики находят Node.js лучше, поскольку они хорошо знакомы с подходом throw-catch.
Критерий №4: кривая обучения
Go – это зрелый и в тоже время относительно новый язык с собственными концепциями, процессами, правилами и интерфейсами. Ему посвящено меньше интернет-ресурсов, поэтому разработчикам приходится проводить исследования, чтобы получить достойное представление о языке.
С другой стороны, JavaScript – наиболее часто используемый во всем мире язык программирования. Разработчикам легко изучить Node.js, если у них есть базовые знания о JavaScript. Поскольку JavaScript существует давно, доступно множество онлайн- и оффлайн-ресурсов для помощи новичкам, а также существует огромное сообщество, которое делится опытом и предлагает помощь.
Таким образом, в сравнении кривой обучения Go и Node.js побеждает последний.
Критерий №5: параллелизм
Параллелизм – сильная сторона Go, так как он лучше всего подходит для крупных высоконагруженных проектов, требующих одновременной обработки тысяч запросов. Go использует горутины и облегченный механизм взаимодействия потоков, который позволяет разработчикам выполнять функции одновременно. Хотя пользователи могут одновременно запускать свои функции с помощью Go, это, к сожалению, не относится к Node.js.
Node.js является однопоточным и использует механизм обратного вызова событий, а значит все должно выполняться в линейном порядке и нет никакого параллелизма.
Итак, в этом раунде Go vs Node.js, Go – чемпион!
Критерий №6: масштабируемость
Go также уверенно выигрывает в битве масштабируемости Go vs Node.js. Горутины позволяют эффективно и надежно обрабатывать параллельные потоки. С другой стороны, масштабируемость Node.js менее функциональна.
Таким образом, Node.js не рекомендуется для крупных проектов из-за слабой поддержки многопоточного исполнения.
Критерий №7: инструменты разработки
Go поставляется с приличным набором библиотек, но по сравнению с Node.js разработчикам доступно меньше готовых инструментов.
Что касается Node.js, он предлагает разработчикам широкий набор инструментов, фреймворков и библиотек для создания всевозможных приложений. Более того, у JS есть огромное сообщество, которое обеспечивает поддержку для всех задач разработки.
Таким образом, Go проигрывает битву, когда дело касается инструментов разработки.
Критерий №8: доступность разработчиков
Найти разработчиков на Go может быть сложнее, чем разработчиков на Node.js. Однако ситуация стремительно меняется и со временем это не будет являться столь критичной проблемой.
Критерий № 9: Сообщество
Node.js – это зрелый инструмент с большим и динамичным сообществом. В первый год своего существования фонд Node.js сформировал команду ответственных за безопасность профессионалов и разработал долгосрочный план поддержки для повышения стабильности. На сегодняшний день репозиторий Node.js имеет 82100 звезд и 21400 форков на GitHub, а также аудиторию в 197000 участников на Reddit.
Сообщество Go с каждым годом продолжает расти. Поддержка Google – довольно веская тому причина. Ежегодный GopherCon собирает разработчиков со всего мира, чтобы обсудить новые возможности и изменения. Эта конференция привела к увеличению количества разработчиков, заинтересованных в участии в сообществе и в связанных с Go. На сегодняшний день репозиторий GoLang имеет 90400 звезд и 13300 форков на GitHub, а также аудиторию в 159000 участников на reddit.com.
Рассматривая такие показатели, как звезды или форки на Github, можно получить представление о количественном соотношении использующих технологию разработчиков и разработчиков, делающих вклад в нее.
Итог
Go занимает лидирующие позиции во всем мире превосходит Node.js в большинстве сценариев, включая производительность, параллелизм, масштабируемость и простоту, но библиотеки Node.js великолепны. Поскольку популярность Go неуклонно растет, можно быть уверенным, что со временем для него будет разработано больше библиотек и инструментов.
Однако на практике выбор технологии для создания приложения тесно связан со знанием этой технологии вашей командой и общей производительностью, которой вы можете достичь с ее помощью. Поиск разработчиков или их знакомство со стеком технологий часто является одним из определяющих факторов.
Итак, если вы очень хорошо разбираетесь в разработке на JavaScript и нуждаетесь в библиотеках Node.js, эквивалент которых может быть недоступен для Go, а также если функциональность Go не столь критична для вашего приложения, Node.js может быть хорошим выбором. В противном случае лучше остановить свой выбор на Go!
Selectel предлагает серверы, оснащенные 4-768 ГБ ОЗУ, 2-72 ядрами ЦП, а также с возможностью подключить графический ускоритель и выбрать в качестве сервера даже Raspberry Pi 4 (4/64 ГБ) и Mac mini для iOS-разработчиков.