Соединение, Запрос и Поток в классическом против реактивного подхода - PullRequest
0 голосов
/ 16 ноября 2018

Я исследую, что такое реактивный, и потому что это своего рода небольшая разница уровней по сравнению с обычным нереактивным подходом, я хотел бы понять, что происходит. Давайте возьмем Tomcat в качестве сервера (я думаю, для netty он будет другим)

Нереактивный

  1. Соединение из браузера создано.
  2. Для каждого запроса берется поток из пула потоков, который его обработает.
  3. После завершения обработки поток возвращает результат через соединение обратно на другую сторону.

Реактивная ???

Как это делается для Tomcat или Netty. Я не могу найти приличную статью о том, как Tomcat поддерживает реактивные приложения и как Netty делает это по-другому (Connection, Thread, объяснение уровня запроса)

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

1 Ответ

0 голосов
/ 26 ноября 2018

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

Так как же достигается эффективное использование?

В качестве примера, скажем, вы запрашиваете данные с сервера несколько раз.

Типичным нереактивным способом вы будете создавать / использовать несколько потоков (может быть из пула потоков) для каждого из ваших запросов. И работа одного конкретного потока состоит только в том, чтобы обслуживать этот конкретный запрос. Поток примет запрос, передаст его серверу и дождется его ответа, пока данные не будут получены с сервера, а затем вернет эти данные клиенту.

Теперь реактивным способом, когда есть запрос, для него будет выделен поток. Теперь, если появится другой запрос, создание другого потока не будет, скорее он будет обслуживаться тем же потоком. Как? Когда поток принимает запрос к серверу, он не будет ждать немедленного ответа от сервера, скорее он вернется и будет обслуживать другой запрос. Теперь, когда сервер ищет данные, и они доступны на сервере, возникает событие, а затем поток переходит к получению этих данных. Это называется механизмом Event-loop, поскольку вся работа по вызову потока, когда данные доступны, достигается путем вызова события. Теперь с этим связана сложность для точного отображения ответа на запросы. И все эти сложности абстрагируются Spring-Webflux (на Java). Таким образом, весь процесс становится неблокирующим. А поскольку для обслуживания всех запросов достаточно одного потока, переключение потоков не будет, у нас может быть один поток на ядро ​​ЦП. Таким образом достигается эффективное использование потоков.

Несколько изображений в сети, чтобы помочь вам понять: -> enter image description here

enter image description here

enter image description here

enter image description here

...