Асинхрони-ИО вс Асинхрони-обрада захтева у јави

У овом чланку покушавам да објасним разлику између обраде Асинц-ИО и Асинц-Рекуест у ХТТП захтеву у свету Јаве.

У свету пре Јава-е 1.4 , Јава обезбеђује АПИ за слање / пријем података преко мрежне утичнице. Оригинални аутори ЈВМ-а пресликали су ово понашање АПИ-ја на АПИ соцкет АПИ, готово један према један.

Па, какво је понашање утичнице за ОС? ОС обезбеђује апи за програмирање сокета, који има позив за блокирање слања / обраде . Будући да је јава само процес који се изводи на врху линука (ОС), стога овај јава програм мора да користи овај блокирајући апи који нуди ОС.

Свет је био срећан и програмери Јава-а почели су да користе АПИ за слање / пријем података. Али морали су да задрже једну јава нит за сваку сокет (клијент).

Свако је писао свој укус ХТТП сервера. Дељење кода постајало је тешко, јава свет је захтевао стандардизацију.

Улази у јава сервлет Спец.

Пре него што кренемо даље, дефинишемо неколико појмова:

Програмер Јава послужитеља : Људи који користе апи јава соцкет и имплементирају хттп протокол попут томцат.

јава програмер апликација: Људи који граде апликацију за посао на врху томцат-а.

ПОВРАТАК САДА

Једном када су спецификације јава сервлета ушле у свет, рекло је:

Драги програмери Јава сервера, наведите метод као у наставку:

doGet(inputReq, OutPutRes)

тако да програмер Јава апликација може да примени doGetи да напишу своју пословну логику. Једном када „програмер апликација“ жели да пошаље response, може да позовеOutPutRes.write().

Треба напоменути: Будући да сои апи блокира, стога и ОутПутРес.врите () такође блокира. Такође, додатно ограничење је било да је објекат одговора урезан на излазу из методе доГет .

Због ових ограничења, људи су морали да користе једну нит за обраду једног захтева.

Време је пролазило и интернет је завладао светом. једна нит по захтеву је почела да показује ограничења.

Проблем 1:

Модел нит по захтеву не успева када постоје дуге паузе током обраде сваког захтева.

На пример: преузимање података из подуслуге траје дуго.

У таквој ситуацији нит углавном седи у празном ходу и ЈВМ може лако остати без нити.

Проблем 2:

Ствари су се погоршале са сталном везом хттп1.1. Као и код трајне везе, основна ТЦП веза ће остати жива и сервер мора да блокира једну нит по вези.

Али зашто сервер мора да блокира једну нит по вези?

Будући да ОС пружа блокаду утичнице Рецв апи, јвм мора да позове метод блокирања ОС-а који блокира како би преслушао више захтева на истој тцп вези од клијента.

Свет је захтевао решење!

Прво решење је потекло од творца ЈВМ-а. Увели су НИО ( АСИНЦ-ИО ). Нио је неблокирајући АПИ за слање / пријем података преко сокета.

Неки позадина:ОС, заједно са блокирајућим соцкет апи, такође пружа неблокирајућу верзију соцкет апи.

Али како ОС то обезбеђује .. Да ли интерно рачва нит и та нит се блокира ???

ОДГОВОР је не ... ОС налаже хардверу да прекида када постоје подаци за читање или писање.

НИО је дозволио програмера јава сервера“за решавање проблема 2 блокирања једне нити по ТЦП вези . Како је НИО ХТТП постојана веза, нит не захтева да блокира у рецв позиву. Уместо тога, сада је може обрадити само када постоје подаци за обраду. То је омогућило једној нити да надгледа / обрађује велики број трајних веза.

Друго решење је дошло из спецификација сервлета. Сервлет Спец је добио надоградњу и увели су асинц подршку (Асинц Рекуест Процессинг).

AsyncContext acontext = req.startAsync();
ВАЖНО: Ова надоградња уклонила је ограничење урезивања објекта одговора при довршењу доГет методе.

То је омогућило „ Програмеру Јава апликација“ да се ухвати у коштац са проблемом 1, пребацивањем посла у позадине нити. Сада, уместо да нит задржи на чекању током дуге паузе, нит се може користити за обраду других захтева.

ЗАКЉУЧАК:

Асинц-ИО у јави у основи користи неблокирајућу верзију на АПИ соцкет ОС.

Обрада асинхроног захтева је у основи стандардизација спецификација сервлета како се обрађује више захтева једним нити.

РЕФЕРЕНЦЕ:

//ввв.сцоттклемент.цом/рпг/соцктут/туториал.пдф

//стацковерфлов.цом/куестионс/15217524/вхат-ис-тхе-дифференце-бет Бетвеен-тхреад-пер-цоннецтион-вс-тхреад-пер-рекуест

Мотивација чланка: Тимско учење / размена знања