Сможет ли Java противостоять атаке JavaScript?

Java JavaScript
Атака JavaScript

В 2014 году нашей эры король Явы в восьмом поколении наконец взошел на престол.

Впервые царь сидел на высоком троне и смотрел на почтительных министров, и впервые испытал силу императорской власти.

Уважаемый министр IO дрожащим голосом выступил вперед: «Ваше Величество, вчера я получил боевой отчет, государство под названием Node.js снова напало на нашу страну, и мои пограничники понесли тяжелые потери».

"Node.js? Что это такое?" Король был вне себя от радости, но нашлись люди, которым очень хотелось раскачать дерево. Если подумать об огромном населении и обширной территории моей империи Ява, затоптать до смерти свою маленькую страну — это не то же самое, что затоптать до смерти муравья.

«Это фреймворк, написанный на JavaScript.» Министр IO опустил руки, когда увидел, что король не знает Node.js.

«JavaScript? Айцин шутит. Как что-то, что работает в браузере, может атаковать мой сервер Java?»

«Ваше величество не знает, этот JavaScript стремительно развивается, не только занимая фронтенд, но и проникая в бэкенд через Node.js, особенно нашу страну. Еще я слышал, что десктопную разработку начали жрать с Электрон!"

«Какого черта! Они хотят забрать все? Разве у нас нет Tomcat? Пошлите Tomcat, чтобы подавить Node.js».

Король начал возмущаться, что его отец JDK 7 и дед JDK 6 не воспринимали Node.js всерьез, не убили Node.js в колыбели, а оставили эту напасть себе, и на сердце стало пусто.

Неблокирующий асинхронный ввод-вывод

Министр потоков выступил вперед: «Ваше Величество, Tomcat несколько дней возглавлял армию, чтобы сражаться с Node.js, и потерпел поражение. У этого Node.js есть уникальное оружие, называемое «неблокирующий асинхронный ввод-вывод».

«Неблокирующий? Я слышал, что наш Tomcat тоже может добиться неблокирующего!» Королевство было немного удивлено.

«Нет, Ваше Величество, Tomcat может добиться неблокировки при обработке соединений, но синхронные операции по-прежнему требуются при обработке запросов. Один запрос обрабатывается одним потоком. В отличие от Node.js, все операции которого являются асинхронными, только основной поток занято." Министр нитей сделал краткий отчет, задаваясь вопросом, сможет ли король понять.

(Фермер кода передан Лао Лю. Примечание: чтобы узнать об истории Node.js, см. "Node.js: мне просто нужен продавец")

«Айцин, что вы должны сказать мне делать? Я не могу позволить этому маленькому Фанбангу много раз запугивать мою достойную империю Ява».

"У министра есть план, - сказал министр сбора. - Хотя Node.js является агрессивным, у него также есть фатальный недостаток. JavaScript - это динамический язык, и он не может выполнять проверку типов во время компиляции, а ошибки могут быть выявлены только при Его можно использовать для разработки небольшого проекта, но как только проект становится больше, с большим количеством кода и большим количеством людей, он становится кошмаром».

«Айцин, скажи мне, что делать?»

«Мы можем послать агентов под прикрытием к Node.js, повсюду распространять такого рода новости, подрывать их боевой дух и заставлять их думать, что система, написанная на Node.js, очень скоро будет испорчена, и, в конце концов, я воспользуюсь своим верным Язык Java, чтобы сделать это. Перепишите».

"Ну, это психологическая война. По крайней мере, она стабилизирует часть травы, и это будет устроено Айцином. Король сказал: "Однако это правило закона не является лекарством от симптомов, и у нас все еще есть чтобы найти способ победить их напрямую».

"Ваше величество действительно род святых", - тут же начал льстить министр-нитка, и в то же время ловко обратил внимание на бессмертного министра ИО: "Моя империя Ява имеет неблокирующий ИО в четвертом поколении королей , на протяжении стольких лет. В прошлом система, подобная Node.js, еще не была разработана, ее и не должно быть».

Насколько проницателен министр ввода-вывода «Бессмертного»: «Ваше Величество, в моем сервере приложений Java Empire всегда доминировал Tomcat. Они используют пул потоков, и каждый запрос — это поток, и мне нелегко вмешаться».

Министр ИО прямо возложил вину на себя.

«Правильно, — отругал министр ассамблеи министра ИО и ударил ножом в обе стороны, — другой момент в том, что это асинхронное программирование звучит хорошо, но писать его фатально, столько обратных вызовов, это просто античеловечно, Субъекты в шутку называют это callback hell, никто не хочет такое писать, и это нормально, что это не развивается».

Министр потоков немедленно ответил: «Плохо, Его Величество научил своих подданных, как использовать лямбда-выражения, и теперь, когда появился RxJava, ада обратных вызовов больше нет!»

"Это сейчас, не раньше!"

"..."

Когда король увидел, что эти министры собираются подраться, он тут же применил прием замачивания грязи: «У каждого джентльмена есть свои причины. Давайте поговорим о том, как победить грозный Node.js».

Никто не говорил.

Королю пришлось отступить.

Цзинчэн Таверна

Трактир в столице всегда был центром распространения многопартийных новостей.

Белокурый молодой человек был «паникером»: «Вы слышали, что Node.js выиграл еще несколько сражений, армия Tomcat понесла тяжелые потери, и многие подданные перешли на сторону этой страны».

«Неужели эта асинхронная операция такая мощная?» — спросил кто-то.

Молодой человек сделал глоток вина: «На самом деле дело не в том, что асинхронные операции лучше, а в том, что асинхронные операции более эффективны в среде с высокой степенью параллелизма. Как мы все знаем, количество потоков, которое машина может поддерживать ограничено, и его невозможно продолжать увеличивать. Tomcat вроде того, как вы запрашиваете поток, может быстро попасть в узкое место».

«Скажите, в чем выгода?» — спросил кто-то.

"Теперь операции на стороне сервера - это не что иное, как работа с файлами, чтение и запись баз данных и доступ к удаленным сервисам. Это так называемые блокирующие операции." Молодой человек расширил картину:

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

Все кивнули. Этот молодой человек уже увидел ключ к проблеме. Многие современные системы интенсивно используют операции ввода-вывода. При высокой степени параллелизма, если кто-то запрашивает один поток, это огромная потеря.

"Я думаю, что моя виртуальная Java-машина такая мощная. Если она может выполнять асинхронные операции, то она не превратит Node.js в шлак за секунды?!" Молодой человек стукнул рукой по столу.

В этот момент кабацкая ворвалась в группу воинов, прогнала толпу, окружила юношу, а вождь попросил: «Наглым образом смутивший народ, да еще пропагандирующий повсюду несинхронные идеи, уведите меня!»

Солдаты жестоко связали его и вытолкнули за дверь, оставив толпу людей болтать.

ИО Палас

"Я просил вас пригласить его, зачем вы его связали? Быстрее ослабьте галстук!" Министр И.О. повернул голову и ласково спросил: "Как вас зовут?"

«Маленький Тим, посох в доме Томкэта», — сказал Тим, потирая плечи.

«Люди в доме Томкэта...» Министр И. О. задумчиво покрутил бороду.

— Да, милорд, я уже видел вас раньше. В прошлый раз, когда вы пришли в дом Томкэта посреди ночи, чтобы тайно поговорить...

«Заткнитесь!» Министр И.О. быстро сменил тему: «Мои подчиненные узнали, что вы везде продвигаете асинхронные идеи, что вы делаете?»

«Злодей изобрел систему под названием Node.x».

«Почему не посвящен генералу Томкэту?»

"Увы, злодей много раз говорил, а генерал не слушает!"

"Скажите, что это за штука? Она имитирует Node.js?" - спросил Министр IO.

Тим раньше рассказывал генералу Томкэту о Node.js, но тот игнорировал это и часто уходил, щелкнув рукавом. У него были все навыки, но никто его не ценил. Мог ли этот министр ввода-вывода помочь ему? Думая об этом, дух Тима был поднят.

«Это действительно вдохновляет, но мой Node.x очень отличается от Node.js с точки зрения архитектуры и некоторых ключевых абстракций, — Тим смущенно улыбнулся, — сначала те же самые части, поскольку он полностью асинхронный, он определенно управляется событиями, так что есть цикл событий».

Министр IO уже разговаривал с министром Swing и знает, что такое цикл событий, что является довольно старой концепцией.

Это не что иное, как поток, обнаруживающий очередь, и если в очереди есть событие, оно обрабатывается.

"Просто здесь я другой. Вы можете создать несколько циклов событий, например, по одному для каждого ядра ЦП, чтобы в полной мере использовать многоядерную производительность ЦП", - с гордостью сказал Тим.

(4 ядра ЦП, 4 цикла обработки событий)

Министр IO одобрительно кивнул, услышав, что Node.js, похоже, имеет только один основной поток и не может напрямую использовать мощность нескольких ядер. Если вы хотите использовать несколько ядер, вам нужно открыть несколько процессов.

Асинхронная работа

"Хандер на вашей картинке - это то место, где находится конкретный бизнес-код, верно? Позвольте мне посмотреть, как это выглядит!", - спросил министр И.О.

Тим быстро представляет код, это простой Hello World.

import io.vertx.core.AbstractVerticle;public class Server extends AbstractVerticle {  public void start() {    vertx.createHttpServer().requestHandler(req -> {      req.response()        .putHeader("content-type", "text/plain")        .end("Hello Word!");    }).listen(8080);  }}скопировать код

Этот код создает простой HTTP-сервер, который прослушивает порт 8080 и возвращает строку «Hello World!» всякий раз, когда поступает запрос.

Когда министр IO увидел это, он сильно удивился: «Вам не нужен внешний контейнер для этого кода, поэтому вы сами построили HTTP-сервер?»

«Да, поэтому нам вообще не нужен Tomcat. Я назвал этот класс Verticle. После развертывания этот Verticle можно связать с циклом событий. Каждый раз, когда есть HTTP-запрос, Node.x будет инкапсулировать его как событие, а затем отправили туда».

"Что за идиот, - подумал про себя министр ИО, - неудивительно, что Томкэт тебя не очень любит. Если ты выйдешь, его положение не гарантировано!"

Министр IO спросил: «Тогда для запроса к базе данных, как вы должны написать Handler, о нет, verticle? Запросы к базе данных настолько медленны, не блокирует ли это цикл обработки событий?

«Сэр, вы забыли, наши операции здесь должны быть асинхронными, и запросы к базе данных не исключение».

Тим показал фрагмент кода для асинхронного запроса к базе данных.

public class DatabaseVerticle extends AbstractVerticle{    ......    dbClient.getConnection(ar -> {        if (ar.succeeded()) {            SQLConnection connection = ar.result();            connection.query("select .. from...", res -> {                       if (res.succeeded()) {                   ......                 } else {                   ......                 }          });        } else {           ......        }    });}скопировать код

Министр IO взволнованно сказал: «О, это старо, это действительно бесполезно, я забыл даже об асинхронности. Кстати, эти вершины вроде бы независимы и вызываются разными потоками. Как они взаимодействуют друг с другом? А? Это тоже через общую память?"

«Лорд действительно удивителен, и он сразу задал основной вопрос,Они не могут совместно использовать память, поэтому их необходимо заблокировать.Я представил здесь метод шины событий для передачи сообщений между ними."

«Ну да, низкая связь достигнута».

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

«Это так хорошо!» Любовь министра И.О. к таланту вдруг возросла, «Хотели бы вы быть штабным офицером в особняке старика?»

«Злодей готов следовать за взрослым!»

«Хорошо! Завтра утром ты войдешь со мной во дворец и встретишься со Святым Мастером. Этот старик будет защищать тебя всю твою жизнь».

Почему Vert.x?

Ранним утром второго дня министр IO не мог дождаться, чтобы объявить королю хорошие новости: «Ваше Величество, моя империя Java также может принять неблокирующее асинхронное программирование! Настал день, чтобы победить Node.js. прямо за углом."

Вчера вечером министр IO рассказал о ситуации, подробно описав преимущества Node.x.

Лицо генерала Томкэта было крайне некрасиво, и он поспешно остановился: «Ваше Величество, я давно использую синхронную обработку в Империи Ява, и мои подданные к ней привыкли. гражданский бунт».

«Айцин, не стоит недооценивать способность ваших подданных осваивать новые технологии. Приведите Тима в храм и предъявите код».

Тим даже не осмелился взглянуть на Томкэта, достал из кармана бумажку и протянул обеими руками.

vertx.createHttpServer()  .requestHandler(function (req) {    req.response()      .putHeader("content-type", "text/plain")      .end("Hello World");}).listen(8080);скопировать код

Король долго смотрел на него: «А? Нет, ты не Java-код, не так ли?»

Томкэт взял код, переданный королем, и взглянул на него: «Смело! Вы осмеливаетесь публично рекламировать JavaScript в зале суда, идите сюда, берите! "

«Ваше величество, это стратегия злодея. Мой Node.x поддерживает программирование на многих языках, кроме Java, есть JavaScript, Ruby, Scala, Kotlin и т. д.»

"О? Это так? Это все еще может привлекать людей из Fanbang! Что вы думаете, генерал Томкэт?" сказал король.

Tomcat чувствовал себя немного неловко и хотел найти способ вернуться: «Что ж, доля правды в этом есть, но имя Node.x нехорошее. Оно заставляет людей смотреть свысока на мою достойную Java-империю».

«Узел означает узел, как насчет того, чтобы изменить его на вершину? Это также означает узел».

«Ваше Величество, можно ли его назвать vert.x?» — предложил министр И.О.

«Ладно, квазиигра, с этого момента я приказываю тебе и Тиму обучить своих подданных пользоваться vert.x, а через месяц начать войну с Node.js!» Король уже давно терпит Node.js .

Нет, семьей Vert.x министра внутренних дел нельзя управлять! 

Царь вдруг подумал о наследственном учении, оставленном его отцом, искусство императора должно уравновесить придворную ситуацию.

"Давай, я хочу поужинать сегодня вечером с генералом Спрингом и министром Тредом, и мне нужно кое о чем с ними поговорить..."

Вы могли бы

node.js: мне нужен только продавец

Ява: рождение империи

JavaScript: контратака диаоси

Распри при дворе Империи Ява

Я лучший язык программирования в мире

Вершина языков программирования

Объектно-ориентированная Библия