Pull to refresh

.NET Core vs Node.js

Reading time5 min
Views31K


Цель данной статьи — не выбор лучшей из двух платформ, а поиск сильных и слабых сторон каждой из них. Обе технологии прочно зарекомендовали себя в мире веб-разработки. Каждая из них имеет своих фанатов, получивших хорошие результаты и делящиеся своими достижениями на просторах интернета. В сети имеются многочисленные отзывы о тех преимуществах, которые получили разработчики при переходе на .Net Core или Node.js. Попытаемся разобраться в этом.

Немного контекста


Я работаю в компании, которая занимается заказной разработкой с 2015 года, сначала мы писали на .NET, затем перешли на .NET Core и потом постепенно сменили стек на Node.JS. Основной причиной была скорость разработки.

Общие сведения




.Net Core

.NET Core — фреймворк общего назначения с открытым кодом, предназначенной для создания кроссплатформенных приложений. Позволяет создавать приложения для различных операционных систем Windows, macOS и Linux. Поддерживает процессоры x64, x86, ARM32 и ARM64. Первый официальный релиз был выпущен 27 июня 2016 года.

Node.js

Согласно данным на официальном сайте, Node.js — это программная платформа, построенная на V8. V8 в свою очередь – разработанный Google движок JavaScript с открытым исходным кодом (написан на с++), транслирующий JavaScript в машинный код. Node.js позволяет создавать приложения на macOS, Linux, SmartOS, FreeBSD, Microsoft Windows, AIX и Android. Первый релиз был в 2009 году.

Система обмена знаниями “Stackoverflow” опубликовала рейтинг популярности фреймворков за прошлый год на основе опроса более 90 тысяч разработчиков, результаты опроса следующие:


Node.js более популярна согласно этому опросу. Однако, результаты могут измениться, когда будет выпущен .Net 5.0, в результате чего второе и третье место по сути объединятся, получив суммарное количество голосов, сравнимое с Node.js на текущий момент.

Язык программирования




Net Core

В основном используется C# — объектно-ориентированный язык программирования, разработан Microsoft в 1998-2001 годах. Строгая типизация позволяет отлавливать ошибки на этапе компиляции, как результат получать более быстрый цикл обратной связи, и в более короткие сроки с меньшим числом ошибок разрабатывать приложения. По средствам ключевого слова “dynamic” позволяет эмулировать динамическую типизацию.

Node.js

JavaScript – это интерпретируемый, объектно-ориентированный язык с динамической типизацией. Так же обладает рядом особенностей присущих функциональным языкам.

Стандартом языка JavaScript является ECMAScript. JavaScript прост в использовании, но многие ошибки приходится отлаживать во время исполнения, в отличие от C#. Для устранения этого недостатка можно воспользоваться TypeScript, представленный Microsoft в 2012 году. TypeScript является надстройкой над JavaScript, обратно совместим с JavaScript и компилируется в последний. Однако TypeScript так же не дает всю мощь строго типизированного объектно-ориентированного языка которую предлагает C#. TypeScript неразрывно связан с JavaScript, который имеет структурную типизацию, как результат может только имитировать работу с типами на подобии С#.

Пример ошибки, которая не проявится на этапе сборки:

interface A {
    x: number;
}
 
let a: A = {x: 5}
 
let b: {x: number | string} = a; 
b.x = "unsound";
 
a.x.toFixed(0); // Not a function error occurs.

Проблема в этом коде с тем, что в результате присваиваний тип у “a.x” будет строка, и ошибка будет только в рантайме.

В заключении этой части представим рейтинг отражающий частоту запросов в Google касаемо интересующих языков:

image

Модули и инструменты




Net Core

Сообщество распространяет инструменты по средствам NuGet пакетов. На текущий момент насчитывается 205 000 пакетов. Для разработки наиболее распространены Visual Studio и Rider, которые упрощают и ускоряют создание приложений.

Node.js

Инструментарием является NPM, который насчитывает 1 298 879 пакетов. Официальной среды разработки не объявлено, но наиболее распространено использование Visual Studio Сode с плагинами для разработки под Node.js.
В целом, выглядит так, что Node.js имеет более широкий выбор инструментов, альтернативных пакетов.

Масштабируемость




Рассмотрим только один вариант масштабируемости – горизонтальный т.е. добавление серверов для обработки увеличивающееся нагрузки.

Net Core

Платформа предоставляет возможность писать многопоточные приложения, поэтому задача загрузки отдельного сервера несколько проще, чем для Node.js. Для задач развертывания, масштабирование и обеспечения отказоустойчивости сервисов Microsoft выпустила “Azure Service Fabric SDK”. Можно использовать этот SDK на своих серверах, в Azure или AWS. Документация размещена тут.

Node.js

Одиночный инстанс использует только один поток, поэтому чтобы загрузить все ядра сервера придется воспользоваться модулем “Cluster” или внешним управлением процессами. Для масштабирования на несколько серверов понадобится балансировщик нагрузки (AWS ELB/NGINX). Так же имеются инструменты, предоставляющие возможность управления сервисами и трафиком, например, Istio.

В целом проблема масштабирования решается на базе обеих технологий, которые предоставляют все необходимые инструменты для этого.

Производительность




Производительность зависит от многих параметров, в том числе выбранных технологий, на базе которых построено приложение. Так же играют свою роль выбранные сценарии, результаты которых будут сравниваться. Поэтому, задача сравнения производительности в большей степени заключается в выравнивании условий экспериментов в которых проводятся замеры. Я выбрал наиболее близкие к реальности конфигурации среди имеющихся бенчмарков, чтобы сравнить их результаты.

Во всех тестах ниже параметры едины и имеют такие значения: ОС – Linux, DB – Postgres, тип ORM – FULL (т.е. не микро ROM и не прямой доступ к DB).

Одиночный запрос в БД

В этом тесте каждый запрос извлекает одну строку из таблицы, далее эта строка сериализуется в JSON и отправляется ответ. Число конкурентных соединений от 16 до 512.



Множественные запросы в БД

В этом тесте каждый запрос выполняет несколько запросов в БД, при этом каждый из них извлекает множество строк. В этом тесте 512 конкурентных соединений.



Обновление данных в БД

Каждый запрос извлекает из БД множество строк, конвертирует их в объекты, изменяет объекты, сохраняет изменения в БД по одному. Далее сериализует обновленные объекты и отправляет их в ответе. В этом тесте 512 конкурентных соединений.



Hello World тест

На запрос получаем ответ в виде простого текста “Hello, World”.



Согласно бенчмаркам, Net Core быстрее Node.js, но нужно всегда рассматривать конкретный сценарий и используемые технологии.

Заключение


Сводная таблица оценок по рассмотренным выше пунктам.



Стоит еще раз отметить, что нет универсального инструмента на все случаи жизни. Если вы начинающий и хотите быстро создавать приложения, имеющие пользовательский интерфейс и серверный код, то Node.js будет отличным выбором. Достаточно разобраться с JavaScript, и он может стать единым языком для серверной и клиентской части.

Сложные, объемные задачи лучше решать с использованием .Net Core, это в большинстве случаев позволяет сократить число внешних зависимостей, что в конечном итоге упрощает поддержку. Node.js имеет хорошую производительность, но если вам нужно что-то большее и ваше приложение подвержено экстремальным нагрузкам, то это повод задуматься об использовании .Net Core.
Only registered users can participate in poll. Log in, please.
А какую платформу предпочитаешь ты, %username%?
24.16% Node.js122
75.84% .NET383
505 users voted. 75 users abstained.
Tags:
Hubs:
-2
Comments43

Articles