Чью жизнь убьет Spring WebFlux?

Spring
Мечтать

Прошлой ночью королю Яве приснился сон.

Во сне был старик с белой бородой, который был совершенно бессмертным, и сказал ему: «Ты, Ява, он слишком слаб, ты даже не можешь реализовать элементарную функцию!»

Король был поражен: «Какую функцию я не могу выполнить с моей достойной Явой?»

Старик показал две строчки кода:

float salary = 1000;float tax =  salary * 0.1;скопировать код

Царь сказал: «Разве это не нормально? Зарплата 1000, а налог равен 100, что могут посчитать учащиеся начальных классов в нашей стране».

Старик сказал: «Если я сейчас установлю зарплату = 2000, сколько будет налог?»

"Все равно 100! Потому что налог не пересчитали!"

«Зарплата изменилась, почему налогов не было одинаково?»

"это......"

Увидев, что король замолчал, старик продолжил: «Вы должны установить связь между переменным налогом и переменным окладом, чтобы они были как в Excel, если значение одной ячейки изменится, формула в Excel, естественно, обновится. другую ячейку. , пусть изменится соответствующим образом».

float salary = 1000;//假设这个命令建立了tax和salary之间的关联float tax <=  salary *0.1salary = 2000 ;assertEquals(200,tax);  //现在tax自动变成了200скопировать код

Король сказал: «Что толку, что ты это делаешь, и, кроме того, это не проблема с Java, у всех языков есть эта проблема…»

Бессмертный старик не ответил и медленно исчез.

модель публикации-подписки

Рано на следующий день король рассказал своим министрам о своей странной мечте, чтобы увидеть, кто мог бы это объяснить ему. Неожиданно Министры много говорили и сказали, что у него такая же мечта.

Это странно, есть ли бог, который намеренно доверяет всем сны? Во сне старая фея приводила всем одинаковые примеры.

Министр конгрегации осторожно сказал: "Он имеет в виду, что налогообложение в нашей стране слишком высокое, оно составляет 10%, и его следует немного снизить?"

Король впился в него взглядом: "Что за бред? У нас налог совсем не высокий, порог повышен до 5000, помимо вычета пяти страховок и одного жилищного фонда, у нас еще льгота по ипотеке, льгота по квартплате, единственный ребенок льготы, пенсионные льготы и т. д. Как можно назвать ряд полисов высокими?»

Собравшийся министр быстро замолчал.

Министр IO продолжил: «Не волнуйтесь, Ваше Величество, старик сказал, что мы, Java, уже предоставили соответствующее решение, то есть модель издатель-подписчик. Если Зарплата рассматривается как издатель источника данных, налоговая Как подписчик, зарегистрируйтесь в Salary, и всякий раз, когда происходит изменение в Salary, отправьте событие в Tax, и после того, как Tax получит его, сделайте соответствующий расчет».

«Разве это не режим непрерывной передачи данных наблюдателям или подписчикам, что толку от такого рода педиатрических штучек?» — сказал старый министр ветки-врага.

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

Высокий параллелизм

Когда король увидел, что два старика снова собираются работать, он тут же сменил тему: «Я слышал, что мы столкнулись с небольшой проблемой с высоким параллелизмом в Java?»

Министр IO сразу обрадовался и полез по линейке: "Да, последние 20 лет наша Ява использует метод пула потоков Tomcat, а сейчас становится все хуже и хуже, и с этим сложно бороться высокий уровень параллелизма».

В это время были приведены министр Кота, министр ниток и даже министр Сервлета, и король втайне сожалел об этом.

Министр IO продолжал красноречиво говорить: «Текущая модель будет иметь поток для обработки каждого запроса. Если запрос включает ввод-вывод или сетевые операции, этот поток должен блокироваться и ждать и не может делать другие вещи».

«Если запрос пользователя слишком велик, вскоре будет использован поток в пуле потоков. В настоящее время нет возможности обслуживать внешний поток».

Это действительно так, модель потоков на основе сервлетов, вот как она работает.

Король спросил: «Зачем ждать, когда поток вызовет службу RPC? Пусть он занимается другими делами, например обработкой очередного запроса?»

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

Король сказал: «Айцин прав, вы уже можете реализовать этот способ NIO, верно?»

«Да, теперь все, что нам нужно сделать, это модифицировать Tomcat, модифицировать или даже заменить Servlet!»

ад обратного звонка

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

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

"Разве у вас нет чего-то вроде Future, Callable и т. д.? Вы можете позволить субъектам использовать это!" Министр И.О. отказался простить.

Министр потоков улыбнулся: «Вы знаете только одно, но другое, когда вы вызываете это future.get(), если работа потока (например, запрос к базе данных) не завершена, текущий поток должен ждать или блокироваться. ."

Министр И.О. немного пожалел, почему он проигнорировал этот слой?

Министр потоков погнался за победой: «Кроме того, даже как вы сказали, все операции асинхронны и управляются событиями, поэтому будет много коллбэков, и проблема ада колбэков в этом коде, вы ее не рассматривали?»

fun1(param,new Callback(){    void onSuccess(...){        ......执行业务逻辑......        fun2(param,new Callback(){              void onSuccess(...){                ......执行业务逻辑......                fun3(param,new Callback(){                    void onSuccess(...){                        ......执行业务逻辑......                        fun4(param,new Callback(){                            void onSuccess(...){                                ......执行业务逻辑......                                                          }                            void onError(...){                            }                        });                    }                    void onError(...){                    }                });            }            void onError(...){            }        });    }    void onError(...){    }});скопировать код

Министр IO увидел этот беспорядочный код, и у него громко загудело в голове — настолько ненормальна эта асинхронная операция!

Король увидел взгляд министра И.О., который больше не разговаривал, и быстро заявил о своем возвращении.

поток событий

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

Сотрудники уже поняли, что сегодня произошло в суде, и выступили вперед: «Сэр, успокойтесь, злодей слышал, что в народе есть что-то, что называется Reactor, какой поток событий и функции высшего порядка в функциональном программировании можно использовать для решения этот адский вопрос об обратном вызове».

поток событий? Министр И.О. внезапно проснулся, почему я не подумал об этом, разве Сяньжэнь Туомэн только вчера не подсказал мне использовать поток событий?

Он быстро спросил: «Как именно?»

«Мы используем диаграмму для представления такого потока событий. На этой временной шкале есть события Error и Complete, которые используются для представления ошибок и завершений соответственно, поэтому я не буду их рисовать».

«Понятно, но что толку?» — спросил министр И.О.

«Этот поток событий можно преобразовать с помощью функционального программирования, такого как карта, чтобы изменить события с «кругов» на «треугольники»».

«Вы также можете использовать фильтр для фильтрации потока событий»

«Ну, это кажется очень ясным, я думаю о сценарии, в котором сначала вызывается функция 1 для генерации потока событий, а затем для каждого элемента в потоке событий снова вызывается функция B, и генерируется новый поток событий, что я должен сделать? ?» спросил министр ИО.

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

"карта, фильтр, плоская карта - это только самые основные операции, есть много операторов, таких как переключение, дублирование, слияние, архивирование и т. д., все функции, которые вы хотите, могут быть удовлетворены!"

- Да-да, - возбужденно потер руки министр И.О., ключевую мысль он уловил, и ад с обратными вызовами можно решить.

Например, первоначальный запрос на асинхронный вызов fun1, вызов fun2, результаты fun1 могут быть записаны только так:

fun1(param,new Callback(){    void onSuccess(...){             fun2(param,new Callback(){              void onSuccess(...){                ......            }            void onError(...){            }        });    }    void onError(...){    }});скопировать код

Теперь предположим, что fun1 возвращает поток данных, а fun2 возвращает поток данных Таким новым способом это можно записать следующим образом:

fun1(param).flatMap( e -> func2(e)).subscribe(r -> showResult(r),       error -> handleError(error));скопировать код

Это эквивалентно выравниванию этой серии обратных вызовов!

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

«Есть много людей, в том числе RxJava, Reactor, вы хотите, чтобы я позвонил их ответственному лицу, чтобы поболтать?»

«Подождите, от одного этого Reactor мало толку. Вы приглашаете министра Spring. Нам нужно позволить Spring использовать Reactor, отказаться от Servlet и превратить все запросы и обработку в асинхронную обработку!»

новая структура

Три месяца спустя министр IO сияюще сообщил королю: «Ваше величество, министр открыл мечту, доверенную бессмертными, которая на самом деле является реализацией Реактивного программирования в моей Империи Java!»

«Реактивное программирование? Странное название!»

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

Министр IO сказал Reactor королю.

«Тогда как использовать этот реактор?»

«Ваше Величество до сих пор помнит о высокой проблеме параллелизма в Java, которая вызвана неспособностью эффективно управлять асинхронностью и адом обратных вызовов. Теперь Чен и Спринг совместно создали проект под названиемSpring WebFluxВещь, посвященная Вашему Величеству, не использует сервлет, может обеспечить неблокирующий ввод-вывод и может эффективно справляться с высокой степенью параллелизма. Министр ИО показал фотографию.

Когда министр Сервлет увидел его лицо, его лицо позеленело: Где мое положение?

Министр Томкэт тоже был недоволен: оказалось, что его семья была единственной, но теперь его выдавила Нетти.

Только министр JDBC не спешит: "Использовать асинхронную неблокировку, чтобы все обрабатывать? Вы экономите, я все равно блокирую доступ к базе данных здесь!"

Министр ИО тайком в душе кричал, как он мог забыть такую ​​важную вещь, как JDBC, ведь он хочет добиться асинхронности и неблокировки,Это должна быть сквозная полносвязная реализация., блокирующий вызов в определенный момент вызовет общую проблему.

Но он по-прежнему сохранял самообладание: «Не волнуйтесь, неблокирующий драйвер JDBC скоро будет выпущен частным сообществом открытого исходного кода».

Король увидел, что этот новый Spring WebFlux вот-вот изменит жизнь нескольких крупных участников, поэтому ему пришлось успокоить Tomcat и Servlet: «Ну, у новых вещей должен быть постепенный процесс принятия, мы позволяем Spring MVC и Spring WebFlux сосуществовать. а пусть субъекты выбирают в соответствии с их реальным положением!»

Постскриптум: пример во сне в этой статье взят из: http://blog.leapoahead.com/2016/03/02/introduction-to-reactive-programming/ Я сделал адаптацию.

Вы могли бы

О Лао Лю и Code Farmer

я нить

Я Java-класс

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

Почтальон Мин из TCP/IP

ЦП Форрест

Принцип балансировки нагрузки

История, которую стоит рассказать HTTP

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

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

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

Язык Си: Идя домой во время праздника Весны, я обнаружил, что только у меня нет объекта