Статьи

Внутри Vert.x. Сравнение с Node.js.

Vert.x — это быстро развивающаяся инфраструктура сервера. Каждая серверная инфраструктура заявляет, что ее сильные стороны — высокая производительность благодаря поддержке множества протоколов. Vert.x делает шаг вперед от этого. Vert.x рассматривает среду создания и эксплуатации сетевой среды сервера. Другими словами, Vert.x учитывает осторожность при создании нескольких «серверных процессов DAEMON», которые работают в среде кластеризации, а также при создании одного серверного процесса DAEMON.

Поэтому важно проверить Vert.x: какую сетевую среду он рассматривает, а также как она обеспечивает высокую производительность. Поэтому я думаю, что будет полезно уделить достаточно времени изучению структуры Vert.x.

Философия Vert.x

Vert.x проект зависит от Node.js . Как и Node.js, Vert.x является серверной средой, предоставляющей модель программирования на основе событий. Поэтому API Vert.x очень похож на API Node.js. Это потому, что обе эти модели предоставляют асинхронный API.

Node.js создается с помощью JavaScript, но Vert.x создается с помощью Java . Тем не менее, это слишком много, чтобы понять Vert.x как Java-версию Node.js. Vert.x был затронут Node.js; но у Vert.x своя уникальная философия, отличная от Node.js.

Наиболее типичная философия дизайна Vert.x сводится к следующему:

  • Polyglot — поддерживает несколько языков.
    Сам Vert.x построен на Java. Тем не менее, Java не требуется для использования Vert.x.
    Помимо языков, основанных на работе JVM, таких как Java или Groovy, Vert.x можно использовать с Ruby, Python и даже JavaScript. Если вам нужно создать серверное приложение с использованием JavaScript, есть альтернатива Node.js. Кроме того, планируется поддержка Scala и Closure.
  • Модель Super Simple Concurrency
    При создании серверного приложения с использованием Vert.x пользователи могут писать код как однопоточное приложение. Это означает, что многопоточный эффект программирования может быть достигнут без синхронизации, блокировки или нестабильности.
    В Node.js механизм исполнения JavaScript не поддерживает многопоточность. Однако, чтобы использовать все ядра ЦП, необходимо выполнить несколько одинаковых программ на JavaScript.
    Однако Vert.x позволяет создавать несколько потоков, основываясь на количестве ядер ЦП, при этом выполняется только один процесс. Он обрабатывает многопоточность, поэтому пользователи могут сосредоточиться на реализации бизнес-логики.
  • Обеспечивает шину событий
    Как описано во введении, цель Vert.x — не только создать «серверный процесс DAEMON». Цель Vert.x — сделать так, чтобы различные серверные программы, созданные на Vert.x, хорошо взаимодействовали друг с другом. Для этого Vert.x предоставляет Event Bus. Поэтому могут использоваться функции MQ, такие как точка-точка или паб / саб (для обеспечения функции шины событий Vert.x использует Hazelcastm , сетку данных в памяти).
    Благодаря этой шине событий серверное приложение, созданное на разных языках, может легко общаться друг с другом.
  • Система модулей и общедоступный репозиторий модулей
    Vert.x имеет систему модулей. Эту модульную систему можно понимать как тип компонента. Это означает, что сам проект серверного приложения, созданного Vert.x, является модульным. Он направлен на повторное использование. Этот модуль может быть зарегистрирован в публичном хранилище модулей. Через общедоступный репозиторий модулей этот модуль можно использовать совместно.

Каковы отношения и различия между Netty и Vert.x?

Прежде чем обсуждать производительность Vert.x, мы должны суммировать отношения между Netty и Vert.x. Vert.x использует Netty. Другими словами, он обрабатывает все операции ввода-вывода с помощью Netty. Поэтому бессмысленно проверять различия в производительности между Vert.x и Netty.

Vert.x — это серверная инфраструктура, которая предоставляет API и функции, отличные от Netty и независимые от них, разработанные с другой целью, чем Netty.

Netty — это инфраструктура, которая может обрабатывать IO низкого уровня, а Vert.x может обрабатывать IO более высокого уровня, чем Netty.

Сравнение производительности с Node.js

Даже если функции, предоставляемые Vert.x, отличаются от функций Node.js, сравнение производительности между ними является существенным вопросом. Рисунок 1 и рисунок 2  ниже показывают производительность Vert.x (Java, Ruby, Groovy) и Node.js. (Источник: http://vertxproject.wordpress.com/2012/05/09/vert-x-vs-node-js-simple-http-benchmarks/ ).

На рисунке 1 показано сравнение производительности при построении HTTP-сервера и возвращении только ответа 200 / OK. На рисунке 2 показано сравнение производительности, когда 72-байтовый статический файл HTML возвращается в качестве ответа.

vertx_nodejs_performance_comparison_200_ok.png

Рисунок 1: Сравнение производительности, когда был получен только ответ 200 / OK.

vertx_nodejs_performance_comparison_72_byte_response.png

Рисунок 2: Сравнение производительности, когда возвращается 72-байтовый статический HTML-файл.

Эта производительность объявлена ​​разработчиками Vert.x, но тест не проводился в строгих условиях. Просто посмотрите на относительные различия в производительности.

Также следует отметить, что производительность Vert.x-JavaScript лучше, чем Node.js. Однако, даже если результат производительности очень надежен, может быть трудно сказать, что Vert.x лучше, чем Node.js. Это потому, что Node.js предоставляет отличные модели, такие как Socket.io, и имеет множество ссылок.

Vert.x Терминология

Vert.x определяет свои уникальные термины и переопределяет общие термины для самого Vert.x. Следовательно, для понимания Vert.x необходимо понимать термины, определенные Vert.x. Ниже приведены популярные термины, используемые в Vert.x:

Verticle

Для Java это класс с методом main. Verticle может также включать другие сценарии, на которые ссылается основной метод. Он также может включать файлы jars или ресурсы. Приложение может состоять из одной статьи или нескольких статей, которые взаимодействуют через шину событий. Наряду с Java его можно понимать как независимо исполняемый класс или файл JAR.

Vert.x Instance

Verticle выполняется в экземпляре Vert.x, а экземпляр Vert.x выполняется в его экземпляре JVM. Таким образом, будет много статей, которые одновременно выполняются в одном экземпляре Vert.x. У каждой статьи есть собственный уникальный загрузчик классов. Таким образом, прямое взаимодействие между статьями через статические члены и глобальные переменные может быть предотвращено. Множество статей может быть одновременно выполнено на нескольких хостах в сети, а экземпляры Vert.x могут быть сгруппированы через шину событий.

совпадение

Экземпляр Verticle гарантирует, что он всегда выполняется на идентичной нити. Поскольку все коды могут быть разработаны как однопотоковый тип операций, разработчики, использующие среду, в которой Vert.x может быть легко разработан. Кроме того, можно предотвратить состояние гонки или тупик.

Модель программирования на основе событий

Как и инфраструктура Node.js, Vert.x предоставляет модель программирования на основе событий. При программировании сервера с использованием Vert.x большинство кодов для разработки связаны с обработчиками событий. Например, обработчик события должен быть настроен на получение данных из сокета TCP или должен быть создан обработчик события, который будет вызываться при получении данных. Кроме того, должны быть созданы обработчики событий для получения сигналов тревоги «когда шина событий получает сообщение», «когда получены HTTP-сообщения», «когда соединение было отключено» и «когда таймер истекает».

Циклы событий

Экземпляр Vert.x внутренне управляет пулом потоков. Vert.x максимально приближает количество пулов потоков к числу ядер ЦП.

Каждый поток выполняет цикл обработки событий. Цикл событий проверяет события как округление цикла. Например, проверка, есть ли данные для чтения в сокете или по какому таймеру произошло событие. Если в цикле есть событие для обработки, Vert.x вызывает соответствующий обработчик (конечно, требуется дополнительная работа, если период обработки обработчика слишком длинный или имеется блокирующий ввод / вывод).

Передача сообщений

Версии используют Event Bus для общения. Если в качестве актера предполагается Verticle, передача сообщений аналогична модели актера, известной в языках программирования Erlang. Экземпляр сервера Vert.x имеет много экземпляров Verticle и позволяет передавать сообщения между экземплярами. Следовательно, система может быть расширена в соответствии с используемыми ядрами без выполнения кода Verticle через многопоточность.

Общие данные

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

Поэтому Vert.x предоставляет метод глобального доступа. Это общая карта . Статьи делятся только неизменными данными.

Vert.x Core

Как указано, это основная функция Vert.x. Функции, которые Vertical может напрямую вызывать, включены в ядро. Поэтому к ядру может обращаться каждый API языка программирования, поддерживаемый Vert.x.

Vert.x Архитектура

Простая архитектура Vert.x показана на следующем рисунке 3 .

vertx_architecture.png

Рисунок 3: Архитектура Vert.x (источник: http://www.javacodegeeks.com/2012/07/osgi-case-study-modular-vertx.html )

Единицей выполнения Vert.x по умолчанию является Verticle, и несколько Ver Verties могут быть одновременно выполнены на одном экземпляре Vert.x. Версии выполняются в потоке цикла обработки событий. Несколько экземпляров Vert.x могут выполняться на нескольких хостах, а также на одном хосте в сети. В это время Верты или модули обмениваются данными с помощью шины событий.

Подводя итог, приложение vert.x состоит из комбинаций Версий или модулей, и связь между ними осуществляется с помощью Event Bus.

vert.x Структура проекта

Ниже приведена структура проекта Vert.x, просматриваемая из затмения при клонировании исходного кода со страницы Vert.x Github .

49e1c3d8d3329e1bd3a1043166caf566.png

Рисунок 4: Дерево исходников Vert.x

Общая конфигурация выглядит следующим образом:

  • vertx-core  — это базовая библиотека.
  • Vertx-платформа  управляет распространением и жизненным циклом.
  • Верт-Ланг используется для представления Core Java API на другом языке.

Gradle используется в качестве системы сборки проекта. Обладает преимуществами муравья и мавена.

Установка Vert.x и выполнение простых примеров

Для использования Vert.x требуется JDK7, поскольку Vert.x использует invokeDynamic в JDK7 .

Vert.x может быть легко установлен.

  1. D Загрузите сжатый установочный файл из http://vertx.io/downloads.html  в нужное место.
  2. Распакуйте файл и добавьте каталог bin в переменные среды PATH.

Это все об установке Vert.x. В командном окне выполните vertx version. Если информация о версии успешно распечатывается, установка завершена.

Пример 1

Теперь давайте создадим и запустим простой веб-сервер с JavaScript, который  выводит «hello world». После написания следующих кодов сохраните его в  файле server.js . Он практически идентичен коду Node.js.

load('vertx.js');
 
vertx.createHttpServer().requestHandler(function(req) {
req.response.end("Hello World!");}) .listen(8080, 'localhost');

Запустите созданное приложение server.js с помощью команды vertx следующим образом:

$ vertx run server.js

Откройте браузер и подключитесь к http: // localhost: 8080 . Если вы можете увидеть «Привет, мир!» сообщение, у вас получилось.

Пример 2

Давайте посмотрим еще один пример построения других языков. Следующий код написан на Java. Он показывает веб-сервер, который читает статический файл и возвращает его в виде ответа HTTP.

Vertx vertx = Vertx.newVertx();
vertx.createHttpServer().requestHandler(new Handler() {
    public void handle(HttpServerRequest req) {
        String file = req.path.equals("/") ? "index.html" : req.path;
        req.response.sendFile("webroot/" + file);
    }
}).listen(8080);

Следующий код написан на Groovy и обеспечивает ту же функциональность:

def vertx = Vertx.newVertx()
vertx.createHttpServer().requestHandler { req ->
def file = req.uri == "/" ? "index.html" : req.uri
req.response.sendFile "webroot/$file"
}.listen(8080)

Будущее Vert.x и NHN

В NHN  мы наблюдаем за развитием Vert.x с момента его официального выпуска. Мы высоко ценим Vert.x. Мы общаемся с главным разработчиком Тимом Фоксом с июня 2012 года, чтобы обсудить пути улучшения Vert.x. Например, Socket.io на Vert.x. Socket.io доступен только на Node.js. Итак, мы перенесли его на Java и отправили запрос   на извлечение https://github.com/vert-x/vert.x/pull/320 в хранилище Vert.x на Gitub. Теперь он объединен с проектом Vert.x-mod.

Наши усилия, модуль socket.io vert.x, будут использоваться для версии RTCS 2.0 (vert.x + Socket.io), которая в NHN не разрабатывается.

Node.js может оставаться очень популярным благодаря Socket.io. Если Vert.x может использовать Socket.io, Vert.x может иметь много вариантов использования. Кроме того, если этот модуль socket.io vertx используется в качестве встроенной библиотеки, будет целесообразно использовать socket.io в приложениях на основе Java.

Что такое RTCS?

RTCS (Система связи в реальном времени) — это платформа для веб-разработки в реальном времени, созданная NHN. Это помогает передавать сообщения между браузером и сервером в режиме реального времени. RTCS была развернута для веб-сервисов NHN, таких как Baseball 9, Me2Day Chatting, BAND Chatting и так далее.

Заворачивать

Первая версия Vert.x была выпущена в мае 2012 года. По сравнению с Node.js, где первая версия была выпущена в 2009 году, история Vert.x очень коротка. Поэтому Vert.x пока не имеет много ссылок. Однако Vert.x поддерживается VmWare и может работать на CloudFoundry. Таким образом, мы ожидаем, что скоро будет получено много ссылок.

Рекомендации

По Seongmin Woo , инженер — программист в Лаборатории Web Platform Development, NHN Corporation.