Растућа популарност ЈаваСцрипт-а донела је са собом пуно промена, а лице веб развоја данас је драматично другачије. Ствари које данас можемо да радимо на мрежи са ЈаваСцрипт-ом покренутим на серверу, као и у прегледачу, било је тешко замислити пре само неколико година или су биле уврштене у заштићена окружења попут Фласх-а или Јава-аплета.
Пре копања у Ноде.јс решења , можда бисте желели да прочитате предности коришћења ЈаваСцрипт преко стека који обједињује језик и формат података (ЈСОН), омогућавајући вам оптималну поновну употребу ресурса за програмере. С обзиром да је ово више предност ЈаваСцрипт-а него Ноде.јс-а, овде о њему нећемо пуно расправљати. Али то је кључна предност укључивања Ноде-а у ваш стек.
Као што Википедиа каже: „Ноде.јс је упакована компилација Гоогле-овог В8 ЈаваСцрипт мотора, слоја апстракције платформе либув и основне библиотеке, која је и сама првенствено написана на ЈаваСцрипт-у.“ Поред тога, вреди напоменути да је Рајан Дахл, творац Ноде.јс, имао за циљ да створи Веб локације у реалном времену са могућностима гурања , „Инспирисан апликацијама попут Гмаил-а“. У Ноде.јс-у је програмерима дао алат за рад у неблокирајућој И / О парадигми вођеној догађајима.
У једној реченици: Ноде.јс блиста у веб апликацијама у реалном времену које примењују пусх технологију преко веб-утичница. Шта је ту толико револуционарно? Па, након више од 20 година мреже без држављанства засноване на парадигми захтјева и одговора без држављанства, коначно имамо веб апликације са двосмјерним везама у стварном времену, гдје и клијент и сервер могу започети комуникацију, омогућавајући им слободну размјену података . Ово је у потпуној супротности са типичном парадигмом веб одговора, где клијент увек покреће комуникацију. Поред тога, све се заснива на отвореном веб стеку (ХТМЛ, ЦСС и ЈС) који се покреће преко стандардног порта 80.
Могло би се тврдити да то имамо већ годинама у облику Фласх и Јава аплета - али у стварности то су била само заштићена окружења која користе мрежу као протокол за транспорт који треба доставити клијенту. Поред тога, радили су изоловано и често су радили преко нестандардних портова, што је можда захтевало додатне дозволе и слично.
Уз све своје предности, Ноде.јс сада игра пресудну улогу у технолошком низу многих компанија високог профила који зависе од његових јединствених предности. Фондација Ноде.јс објединила је сва најбоља размишљања о томе зашто предузећа треба да размотре Ноде.јс у краткој презентацији која се може наћи на Страница Студије случаја Ноде.јс фондације .
У овом водичу за Ноде.јс разговараћу не само о томе како се постижу ове предности, већ и о томе зашто бисте можда желели да користите Ноде.јс - и што да не —Користећи неке од класичних модела веб апликација као примере.
Главна идеја Ноде.јс-а: употреба неблокирајућих И / О покретаних догађајима да би остала лагана и ефикасна у случају апликација које у реалном времену захтевају податке и раде на дистрибуираним уређајима.
То је залогај.
Шта заправо значи је да је Ноде.јс не нова платформа сребрне боје која ће доминирати светом веб развоја. Уместо тога, то је платформа која испуњава одређену потребу. ТвеетШта је стварно значи да је Ноде.јс не нова платформа сребрне боје која ће доминирати светом веб развоја. Уместо тога, то је платформа која испуњава одређену потребу . А разумевање овога је апсолутно неопходно. Дефинитивно не желите да користите Ноде.јс за ЦПУ-интензивне операције; у ствари, употреба за тешка рачунања поништиће готово све његове предности. Ноде заиста блиста у изградњи брзих, скалабилних мрежних апликација, јер је способан да обрађује огроман број истовремених веза са великом пропусношћу, што је једнако великој скалабилности.
Прилично је занимљиво како то ради испод хаубе. У поређењу са традиционалним техникама веб-послуживања где свака веза (захтев) генерише нову нит, заузимајући системску РАМ меморију и на крају увећавајући количину доступне РАМ меморије, Ноде.јс ради на једној нити, користећи неблокирајући И / О позиви, омогућавајући му да подржи десетине хиљада истовремених веза које се држе у петљи догађаја.
Брза калкулација: под претпоставком да свака нит потенцијално има пратећа 2 МБ меморије, покретање на систему са 8 ГБ РАМ-а доводи до теоретског максимума од 4.000 истовремених веза (прорачуни преузети из чланка Михаела Абернетхија „Шта је само Ноде.јс?“, објављеног на ИБМ девелоперВоркс 2011. године; нажалост, чланак више није доступан) , плус трошкови пребацивање контекста између нити . То је сценарио са којим се обично бавите у традиционалним техникама веб-послуживања. Избегавајући све то, Ноде.јс постиже ниво скалабилности преко 1М истовремених веза , и преко 600к истовремених веза са веб соцкетима .
Постоји, наравно, питање дељења једне нити између свих захтева клијената и то је потенцијална замка писања Ноде.јс апликација. Прво, тешко рачунање може да затре Ноде-ову појединачну нит и да створи проблеме свим клијентима (о томе више касније) јер ће долазни захтеви бити блокирани док наведено рачунање не буде завршено. Друго, програмери треба да буду заиста опрезни да не дозволе изузетак који се шири до језгре (најгорње) петље догађаја Ноде.јс, што ће довести до прекида инстанце Ноде.јс (што ефикасно руши програм).
Техника која се користи за избегавање изузетака који излазе на површину је преношење грешака натраг позиваоцу као параметри повратног позива (уместо да их се баца, као у другим окружењима). Чак и ако неки необрађени изузетак успе да се створи, развијени су алати за надгледање процеса Ноде.јс и извођење потребних опоравак срушене инстанце (иако вероватно нећете моћи да вратите тренутно стање корисничке сесије), најчешће је Заувек модул , или користећи другачији приступ са спољним системским алатима упстарт и промпт , или чак само искорак .
Када се расправља о Ноде.јс-у, једна ствар коју дефинитивно не би требало изоставити је уграђена подршка управљање пакетима помоћу НПМ-а , алат који подразумевано долази уз сваку инсталацију Ноде.јс-а. Идеја НПМ модула је прилично слична идеји Руби Гемс : скуп јавно доступних компонената за вишекратну употребу, доступних једноставном инсталацијом путем мрежног спремишта, са управљањем верзијама и зависностима.
Комплетну листу упакованих модула можете пронаћи на нпм веб страница , или приступити помоћу нпм ЦЛИ алата који се аутоматски инсталира са Ноде.јс. Екосистем модула отворен је за све и свако може објавити свој модул који ће бити наведен у нпм спремишту.
Неки од најкориснијих нпм модула данас су:
Листа се наставља. Постоји мноштво заиста корисних пакета, доступних свима (без увреде онима које сам овде изоставио).
Цхат је најтипичнија вишекорисничка апликација у реалном времену. Од ИРЦ-а (некада у прошлости), преко многих заштићених и отворених протокола који се изводе на нестандардним портовима, до могућности да се све примени данас у Ноде.јс-у са веб соцкетима који раде преко стандардног порта 80.
Апликација за ћаскање је заиста слатка тачка за Ноде.јс: то је лагана, велика посета, апликација која захтева податке (али са мало обраде / рачунања) која се покреће на дистрибуираним уређајима. Такође је одличан случај употребе и за учење, јер је једноставан, али покрива већину парадигми које ћете икада користити у типичној Ноде.јс апликацији.
Покушајмо да прикажемо како то функционише.
У најједноставнијем примеру, на нашој веб локацији имамо једну чет собу, у коју људи долазе и могу размењивати поруке на један-на-више (заправо све) начине. На пример, рецимо да на веб локацији имамо троје људи који су сви повезани на нашу огласну таблу.
На страни сервера имамо једноставну Екпресс.јс апликацију која примењује две ствари:
GET /
управљач захтевима који служи веб страници која садржи и огласну плочу и дугме „Пошаљи“ за иницијализацију уноса нове поруке, иНа страни клијента имамо ХТМЛ страницу са постављеним неколико обрађивача, једном за догађај клика на дугме 'Сенд', који преузима улазну поруку и шаље је у вебсоцкет, а другу која ослушкује нове долазне поруке на клијенту вебсоцкетс (тј. поруке које су послали други корисници, а које сервер сада жели да клијент прикаже).
Када један од клијената пошаље поруку, ево шта се дешава:
Ово је најједноставнији пример . За више робусно решење , можда ћете користити једноставну кеш меморију засновану на продавници Редис. Или у још напреднијем решењу, реду порука за управљање рутирањем порука клијентима и робуснијем механизму испоруке који може покрити привремене губитке везе или чување порука за регистроване клијенте док су ван мреже. Али без обзира на побољшања која направите, Ноде.јс ће и даље радити под истим основним принципима: реаговање на догађаје, руковање многим истовременим везама и одржавање флуидности у корисничком искуству.
Иако Ноде.јс заиста блиста са апликацијама у реалном времену, сасвим је природно погодно за излагање података из објектних ДБ-ова (нпр. МонгоДБ). Спремљени подаци у ЈСОН-у омогућавају Ноде.јс-у да функционише без неусклађености импедансе и конверзије података.
На пример, ако користите Раилс, конвертовали бисте из ЈСОН-а у бинарне моделе, а затим их изложили натраг као ЈСОН преко ХТТП-а када податке троше Бацкбоне.јс, Ангулар.јс итд., Или чак јКуери АЈАКС позива. Помоћу Ноде.јс можете једноставно изложити своје ЈСОН објекте помоћу РЕСТ АПИ-а који ће клијент потрошити. Поред тога, не морате да бринете о конверзији између ЈСОН-а и било чега другог приликом читања или писања из ваше базе података (ако користите МонгоДБ). Укратко, можете избећи потребу за вишеструким конверзијама користећи јединствени формат сериализације података на клијенту, серверу и бази података.
Ако примате велику количину истовремених података, ваша база података може постати уско грло. Као што је приказано горе, Ноде.јс лако може да обрађује саме истовремене везе. Али пошто је приступ бази података операција блокирања (у овом случају), наилазимо на проблеме. Решење је препознати понашање клијента пре него што се подаци заиста упишу у базу података.
Тим приступом систем одржава своју реакцију под великим оптерећењем, што је посебно корисно када клијенту није потребна чврста потврда о успешном писању података. Типични примери укључују: евидентирање или писање података о праћењу корисника, обрађених у групама и коришћених до каснијег времена; као и операције које не треба да се одмах одражавају (попут ажурирања броја „лајкова“ на Фацебоок-у) где евентуална доследност (тако често коришћен у свету НоСКЛ) је прихватљив.
Подаци се стављају у ред чекања путем неке врсте инфраструктуре за предмеморирање или чекање порука - као што је РаббитМК или ЗероМК - и пребацују одвојеним процесом групног писања базе података или позадинским услугама обраде интензивном рачунањем, написани у платформи за боље обављање таквих задатака. Слично понашање се може применити на другим језицима / оквирима, али не на истом хардверу, са истом високом, одржаваном пропусношћу.
Укратко: са Ноде-ом можете одгурнути отпис базе података и касније се позабавити њима, поступајући као да су успели.
У традиционалнијим веб платформама, ХТТП захтеви и одговори се третирају као изоловани догађај; у ствари, они су заправо стримови. Ово запажање се може користити у Ноде.јс за изградњу неких сјајних карактеристика. На пример, могуће је обрађивати датотеке док се још увек отпремају, јер подаци долазе кроз ток и можемо их обрадити на мрежи. Ово би се могло учинити за аудио или видео кодирање у реалном времену и проксирање између различитих извора података (погледајте следећи одељак).
Ноде.јс се лако користи као прокси на страни сервера где може да обрађује велику количину истовремених веза на неблокирајући начин. Посебно је корисно за проксирање различитих услуга са различитим временима одзива или за прикупљање података из више изворних тачака.
Пример: размислите о томе да апликација на страни сервера комуницира са независним ресурсима, увлачи податке из различитих извора или складишти средства као што су слике и видео снимци у услуге независних произвођача у облаку.
најкритичнији корак у анализи пројекта је:
Иако наменски проки сервери постоје, коришћење Ноде уместо тога могло би бити корисно ако ваша проки инфраструктура не постоји или ако вам је потребно решење за локални развој. Под овим мислим на то да бисте могли да направите апликацију на страни клијента са Ноде.јс развојним сервером за средства и АПИ-је за проксирање / превртање, док бисте у продукцији обрађивали такве интеракције са наменском проки услугом (нгинк, ХАПроки итд.) .).
Вратимо се на ниво апликације. Још један пример где софтвер за рачунаре доминира, али би се могао лако заменити веб решењем у реалном времену је софтвер за трговање брокера, који се користи за праћење цена акција, извршавање прорачуна / техничке анализе и креирање графикона / графикона.
Прелазак на решење засновано на Интернету у реалном времену омогућило би брокерима да лако мењају радне станице или радна места. Ускоро бисмо их могли почети виђати на плажи на Флориди .. или Ибизи .. или Балију.
Још један уобичајени случај употребе у који се Ноде-витх-веб-соцкетс савршено уклапа: праћење посетилаца веб странице и визуализација њихове интеракције у реалном времену.
Можете да прикупљате статистику корисника у стварном времену или је чак померите на следећи ниво увођењем циљаних интеракција са посетиоцима отварањем комуникационог канала када дођу до одређене тачке у вашем левку. (Ако сте заинтересовани, ову идеју већ продуцира ЦАНДДи .)
Замислите како бисте могли да побољшате своје пословање када бисте знали шта посетиоци раде у реалном времену - ако бисте могли да визуализујете њихове интеракције. Са двосмерним утичницама Ноде.јс у реалном времену, сада то можете.
Посетимо сада инфраструктурну страну ствари. Замислите, на пример, добављача СааС-а који жели да понуди својим корисницима страницу за надгледање услуга, попут ГитХуб-ове странице статуса. Помоћу петље догађаја Ноде.јс можемо да креирамо моћну контролну таблу засновану на мрежи која у статусу услуге проверава статус услуге асинхрони начин и уступа податке клијентима који користе веб-утичнице.
И интерни (унутар компаније) и статус јавних служби могу се пријавити уживо и у реалном времену помоћу ове технологије. Гурните ту идеју мало даље и покушајте да замислите а Мрежни оперативни центар (НОЦ) надгледање апликација у телекомуникационом оператеру, облаку / мрежи / провајдеру хостинга или некој финансијској институцији, а све се покрећу на отвореном веб стеку који подржава Ноде.јс и вебсоцкетс уместо Јава и / или Јава аплета.
Напомена: Не покушавајте да градите тврде системе у реалном времену у Ноде-у (тј. Системе који захтевају доследно време одзива). Ерланг је вероватно бољи избор за ту класу примене.Ноде.јс са Екпресс.јс се такође може користити за креирање класичних веб апликација на страни сервера. Међутим, иако је могуће, ова парадигма захтева и одговора у којој би Ноде.јс носио около приказани ХТМЛ није најтипичнији случај употребе. Постоје аргументи за и против овог приступа. Ево неколико чињеница које треба узети у обзир:
Прос:
Против:
На пример, упоређујући Ноде.јс са Екпресс.јс против Руби он Раилс, некада је постојала чиста одлука у корист овог другог када је реч о приступу релационим базама података као што су ПостгреСКЛ, МиСКЛ и Мицрософт СКЛ Сервер.
Релациони ДБ алати за Ноде.јс били су још увек у раној фази. С друге стране, Раилс аутоматски омогућава подешавање приступа подацима одмах са кутијама, заједно са алатима за подршку миграције ДБ шеме и другим драгуљима (намењен каламбуру). Раилс и његови равноправни оквири имају зреле и доказане примене слоја приступа подацима Ацтиве Рецорд или Дата Маппер. [*]
Али ствари су се промениле. Секуелизе , ТипеОРМ , и Полица за књиге су прешли дуг пут ка томе да постану зрела ОРМ решења. Такође би било вредно погледати Придружите се Монстеру ако желите да генеришете СКЛ из ГрапхКЛ упита.
[*] Могуће је и реткост да Ноде користите само као предњи део, а да Раилс буде бацк-енд и лак приступ релационом ДБ-у. Повезан: Задњи крај: Коришћење Гатсби.јс и Ноде.јс за статичка ажурирања веб локацијаКада је реч о тешким прорачунима, Ноде.јс није најбоља платформа. Не, дефинитивно не желите да направите Фибонацци рачунски сервер у Ноде.јс . Генерално, било која ЦПУ интензивна операција поништава све погодности протока које Ноде нуди својим улазно-излазним моделом не-блокирајућим на основу догађаја, јер ће сви долазни захтеви бити блокирани док је нит заузет вашим бројањем - претпостављајући да покушавате за покретање рачунања у истој инстанци чвора којом одговарате на захтеве.
Као што је претходно речено, Ноде.јс је једнонитни и користи само једно ЦПУ језгро. Када је реч о додавању паралелности на вишејезгреном серверу, постоји основни посао који обавља Ноде цоре тим у облику модула кластера [реф: хттп://нодејс.орг/апи/цлустер.хтмл]. Такође можете прилично лако покренути неколико инстанци Ноде.јс сервера иза а обрнути прокси преко нгинк-а .
Са кластеровањем, и даље бисте требали преоптеретити сва тешка рачунања у позадинске процесе написане у погоднијем окружењу за то и омогућити им да комуницирају путем сервера реда за поруке као што је РаббитМК.
Иако се ваша позадинска обрада у почетку може изводити на истом серверу, такав приступ има потенцијал за врло високу скалабилност. Те услуге обраде у позадини могу се лако дистрибуирати на одвојене радничке сервере без потребе за конфигурисањем оптерећења предњих веб сервера.
Наравно, користили бисте исти приступ и на другим платформама, али са Ноде.јс добијате тако високу пропусност захтева / сек о којој смо разговарали, јер је сваки захтев мали задатак који се решава врло брзо и ефикасно.
Разговарали смо о Ноде.јс од теорије до праксе, почевши од његових циљева и амбиција, а завршавајући његовим слатким тачкама и замкама. Када људи наиђу на проблеме са Ноде-ом, то се готово увек своди на чињеницу да блокаде су корен свега зла —99% злоупотреба чворова долази као директна последица.
У Нодеу су операције блокирања коријен свега зла - 99% злоупотреба Ноде-а долази као директна последица. ТвеетЗапамтите: Ноде.јс никада није створен за решавање рачунарског проблема скалирања. Створен је за решавање проблема И / О скалирања, који је добро ради .
Зашто користити Ноде.јс? Ако ваш случај употребе не садржи ЦПУ интензивне операције нити приступа било каквим ресурсима за блокирање, можете искористити предности Ноде.јс-а и уживати у брзим и скалабилним мрежним апликацијама. Добродошли на веб у стварном времену.
Ноде.јс је ЈаваСцрипт окружење на страни сервера на страни сервера. Отвореног је кода, укључујући Гоогле-ов В8 енгине, либув за компатибилност са више платформи и основну библиотеку. Важно је напоменути да Ноде.јс не излаже глобални објекат „прозор“, јер се не покреће у прегледачу.
Ноде.јс се првенствено користи за неблокирајуће сервере вођене догађајима због своје једне нити. Користи се за традиционалне веб локације и позадинске АПИ услуге, али је дизајниран имајући на уму архитектуре засноване на пусх-у.
Веб оквири попут Ангулар и Реацт су библиотеке које помажу у организовању и генерисању предњег кода који се покреће у веб прегледачу. Смањују време развоја, поновном употребом кода за уобичајене операције. Неки веб оквири су „пуни стек“, што значи да генеришу и позадински код који се покреће на веб серверу.
Не, то је окружење и у њему се покрећу позадински оквири. Популарни су Екпресс.јс (или једноставно Екпресс) за ХТТП сервере и Соцкет.ИО за ВебСоцкет сервере.
Не, '.јс' значи да је програмски језик који користите са Ноде.јс ЈаваСцрипт (или било шта што може да се транспилира на њега, као што су ТипеСцрипт, Хаке или ЦоффееСцрипт.)
Осим што је ефикасан у свом деловању, Ноде.јс је популаран и зато што има огроман, активан екосистем заснован на ЈаваСцрипт-у са отвореним кодом. Такође, не прекида компатибилност између верзија на главне начине.
Ноде.јс извршава ЈаваСцрипт код у свом окружењу на серверу, док је Ангулар ЈаваСцрипт оквир који се извршава на клијенту (тј. У веб прегледачу.)
Ноде.јс, који је једнонитни, може бити лош избор за веб сервере који се дуплирају као рачунски сервери, јер ће тешка рачунања блокирати одзив сервера. Међутим, сам Ноде.јс није лош: технологија је прилично зрела и широко се користи за много различитих врста сервера.