Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Node.js — не безупречный продукт, у него есть недостатки (использование JS?), некоторые из них тянулись еще с раннего этапа разработки из-за ошибочных решений, принятых Райаном Далем, о которых немного вспомнили в статье Как создатель node.js сам разочаровался в нем. Как это часто бывает, в некоторых случаях альтернативу этой системе найти сложно или невозможно, особенно в секторе энтерпрайза. Но если не требуется поддержки большого легаси-кода, который еще много лет будут снабжать работой программистов, то можно взглянуть в сторону других решений. Про “убийцу Node.js” можно почитать в статье, указанной выше, о некоторых других будет рассказано в этой статье.
ASP.NET
“Старый друг лучше новых двух”. ASP.NET имеет длинную историю. Технология Active Server Pages, которая легла в основу сервисов ASP.NET, была разработана аж в конце прошлого века. Конечно, продолжительность разработки это не всегда хорошо, но долгая жизнь продукта говорит о многом. Хоть у ASP.NET совсем другой принцип работы, это не просто окружение для запуска программного кода и подключения модулей, это платформа для создания веб-сервисов; она часто используется для решения похожих с Node.js задач.
Если Node.js детище небольшой команды и в самом базовом виде является средой запуска программ на JS вне браузера с доступом к вводу/выводу, то ASP.NET типичный продукт огромной корпорации. В нем изначально содержится большое количество дефолтных библиотек, которые сразу позволяют начать разработку. Node развивается благодаря сообществу разработчиков, и потому систему надо сначала обвесить всеми необходимыми модулями, которых просто невероятное количество. Простейший “Hello world!” на Node притащит в систему несколько тысяч файлов. Причем, количество не всегда перерастает в качество, иногда создается впечатление, будто разработчики даже “i++” готовы запихать в отдельный модуль, который потом будет скачан миллион раз, а внезапное обновление или удаление этого пакета вызовет серьезные проблемы совместимости или обрушит npm. В ASP за безопасностью и обновлениями следит экосистема Microsoft, библиотеки, написанные ей и другими крупными компаниями, тщательно проверены на ошибки и проблемы с совместимостью…
Несмотря на многие отличия, одним из главных является разный подход к распределению вычислений. В Node.js все выполнялось в одном потоке, но с помощью асинхронного ввода/вывода. ASP изначально работала в многопоточном режиме и синхронном вводе/выводе. Первый вариант показывает большую производительность при работе сервисов требующих очень интенсивный обмен, но ценой некоторого усложнения кода. В последних версиях продуктов эти отличия сглаживаются, в Node.js и ASP.NET применяется паттерн async\await.
JS очень сильно вырос за время своего развития, но все равно остается языком без строгой типизации и проигрывает C#, который изначально разрабатывался под прямым влиянием C++, с первых дней имевшем строгую типизацию и ООП. Следствием этого является то, что C# мощнее и более цельнее, ему не требуются надстройки вроде TS. Но зато JS за счет своей простоты более востребован при программировании микросервисов, в котором не требуются сложные возможности C#.
Кроме различий используемых языков программирования, у этих платформ разная идеология. В ASP.NET многое предопределено, он предлагает все готовое, начиная с файловой структуры, тогда как, начиная работать с Node.js, приходится выбирать все самому, что дает большую гибкость, но усложняет разработку. Зато в ASP.NET есть мощные инструменты отладки, тестирования и рефакторинга.
Единственное в чем ASP.NET серьезно уступает Node.js — это простота развертывания. Node нужен только движок и прокси-сервер или Docker. Платформу можно настроить как самому, так и взять готовый образ VPS, который есть практически у любого хостинг-провайдера. Для ASP, несмотря на кроссплатформенность, все не так легко, а готовые образы для серверов есть только у самых крупных игроков уровня Azure.
Так ли нужен JavaScript?
Node.js создавалась как среда выполнения для JS, потому что это простой и доступный язык программирования, с помощью которого легко удалось реализовать одновременное выполнение нескольких сценариев для двустороннего обмена данными веб-приложения между браузером и сервером. ASP.NET тоже создавался для написания веб-приложений, только с помощью других методов. Тот же Deno состоит из нескольких слоев над виртуальной машиной, которая непосредственно работает с ресурсами сервера. Но ведь не обязательно использовать сложные обертки из языков программирования, которые не исполняются непосредственно на сервере и требуют виртуальных машин.
Go
В 2007 году инженеры компании решили, что C++ не отвечает текущим реалиям компьютерных технологий. Требовались эффективные средства распараллеливания, использующие возможности многоядерных процессоров и распределенных систем, нужен был автоматический сборщик мусора и некоторые упрощения для лучшей читаемости кода и удобства работы с типами.
У разработчиков было целью не создать “лучшую версию C++”, а сделать новый язык более понятным, основываясь на своем опыте программирования. Go был публично анонсирован в 2009 году, довольно быстро поднялся почти в топ-10 языков программирования (13 место в начале 2012 года). Сам Раймон Даль расхваливал его в выражениях наподобие: “Зачем Node.js, если есть такой прекрасный язык как Go?”. Но новизна прошла, и язык был почти забыт, пока не оказалось, что его средства распараллеливания хорошо подходят для разработки микросервисов в веб-приложениях. Это вернуло языку былую популярность.
Для Go написано несколько веб-фреймворков, хотя пользоваться ими не обязательно, потом что “из коробки” у него есть весь функционал, необходимый для программирования веб-приложений. Изначально Deno был написан именно на Go.
Ruby
Снова вспомним Deno, а именно то, что сейчас его код написан на Ruby.
По сравнению с тем же Go, это не самый новый язык, его релиз был в 1995 году. В отличии от Go, разработкой занимался одиночка-энтузиаст Юкихиро Мацумото, который загорелся созданием объектно-ориентированного, интерпретируемого языка, который был бы лучше чем Pyton. Популярность язык завоевал далеко не сразу, не в последнюю очередь потому, что первую пару лет его документация была только на японском. Книги на английском языке вышли только в начале 2000-х, а признание пришло после выхода веб-фреймворка Ruby on Rails в 2005 году, который быстро стал популярным, особенно когда Apple заявила в 2007 году, что будет поставлять его в составе Mac OS X 10.5.
Как и во всех интерпретируемых языках, скорость Ruby была сравнительно небольшой, что сильно сказывалось в работе веб-приложений, написанных на Ruby on Rails. Зная эту проблему, автор стал разрабатывать версию языка, которая потеряла бы обратную совместимость, но стала бы выполняться гораздо быстрее, что и было им сделано в 2009 году. Скорость выросла очень существенно и сравнялась с веб-приложениями работающими под .NET и JVM. Благодаря этому резко выросла популярность фреймворка. В 2018 году автор Ruby выпустил версию 2,6, в которой реализована динамическая компиляция, что еще сильнее ускоряет работу приложений.
До сих пор язык Ruby, плотно ассоциируется именно с фреймворком Ruby on Rails.
Elixir
Erlang — еще один язык программирования, созданный большой корпорацией. На этот раз постарались шведы из Ericsson. В 1986 году никто не думал о разработке веб-приложений, интернет был еще в проекте, а язык создавался для работы систем в реальном режиме времени. Долгое время Erlang был практически неизвестен за пределами компании, которая использовала его для своих внутренних нужд, пока в 1998 году руководство не решило прекратить поддержку собственного языка и запретило его использование, обязав разработчиков перейти на Java. Это привело к тому, что язык выпустили под открытой лицензией, и он стал распространяться за пределами компании, которая его разработала. Долгое время он был интересен только небольшому кругу ученых, пока не оказалось, что его концепция хорошо подходит для разработки под многопроцессорную архитектуру.
В 2012 году Хосе Валим, один из разработчиков Ruby on Rails, загорелся идеей создать язык программирования для высоконагруженных систем и больших веб-сайтов. В итоге был разработан Elixir, функциональный язык программирования, компилируемый в байт-код для виртуальной машины Erlang (BEAM). Благодаря тому, что в основе языка лежит Erlang, который разрабатывался для программирования коммуникационного оборудования, Elixir получил уникальные свойства: отказоустойчивость, горячую замену кода (изменение или откат кода работающей программы, без ее перезапуска) и возможность работы в реальном режиме времени. Эти свойства позволяют создавать надежные высоконагруженные системы, поддерживающие как горизонтальное, так и вертикальное масштабирование, работающие в 5-10 раз быстрее, чем аналогичные приложения написанные на интерпретируемых языках (PHP, Ruby, Python). Место работы создателя повлияло на то, что в языке используется Ruby-подобный синтаксис, и его легко освоить тем, кто пользуется Ruby on Rails.
На данный момент Elixir используется в таких известных компаниях, как Discord, Square Enix, PepsiCo и Sketch.
А если, все-таки JavaScript?
Но если осваивать новый язык программирования нецелесообразно, как и тащить на сервер всю Ноду? Можно посмотреть на другие среды выполнения JS.
RingoJS это многопоточная платформа, построенная на JVM и оптимизированная для работы на серверах. Для интерпретации кода JS используется движок Mozilla Rhino, имеющий внушительную историю. Его начали разрабатывать в 1997 году, еще во времена Netscape, позже проект передали Mozilla Foundation и выложили в open source.
Приложения RingoJS могут быть развернуты на любой платформе под управлением Linux, вплоть до Raspberry Pi, или поверх облачных платформ типа Google App Engine. Модульная система RingoJS основана на CommonJS, можно даже использовать некоторые модули от Node.js. Также движок Ringo позволяет интегрировать библиотеки написанные на Java.
PurpleJS это еще один простой JS-фреймворк запускаемый на JVM. В качестве движка JS используется Nashorn (тоже носорог), разрабатываемый Oracle. Нельзя сказать, что это полноценная замена Node, потому что фреймворк не использует асинхронный режим, а Nashorn не имеет поддержки CommonJS, зато он очень легкий и не требует перезапускать сервис после изменения кода.
Vert.x — это уже не фреймворк, а мультиязычный набор инструментов, позволяющий создавать полностью асинхронные реактивные веб-приложения, микросервисы и сетевые утилиты запускаемые на JVM. Поддерживаемые языки не ограничиваются только Java и JS, кроме них можно писать приложения на Groovy, Ruby, Scala и Kotlin, поддерживается модульная система с централизованным репозиторием, Vert.x легко расширяется и масштабируется.
Забавно, что проект сначала назывался Node.x, потом его переименовали, чтобы избежать юридических проблем, потому что цели при создании были такие же, как у Node.js, и Тим Фокс (создатель Vert.x) говорил, что вдохновлялся успехом Дали и “хотел сделать Node.js на JVM”.
Если альтернативы не впечатляют и node.js остается вашей любовью
Можно брать преднастроенный сервер сразу с node.js из маркетплейса