ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликацијаПоново објављујемо транскрипт извештаја са конференције ХигхЛоад++ 2016. који се одржао у Сколкову код Москве 7-8. новембра прошле године. Владимир Протасов објашњава како проширити НГИНКС функционалност помоћу ОпенРести и Луа.

Здраво свима, зовем се Владимир Протасов, радим у Паралелима. Рећи ћу вам мало о себи. Проводим три четвртине свог живота пишући код. Постао сам програмер до сржи у буквалном смислу: понекад видим код у својим сновима. Четвртина живота је индустријски развој, писање кода који иде директно у производњу. Код који неки од вас користе, али га не схватају.

Па разумете колико је било лоше. Када сам био млађи, дошао сам и добио сам ове базе података од два терабајта. Сада је велико оптерећење за све овде. Ишао сам на конференције и питао: „Момци, реците ми, имате велике податке, да ли је све у реду? Колико база имате тамо? Одговорили су ми: „Имамо 100 гигабајта!“ Рекао сам: "Кул, 100 гигабајта!" И размишљао сам у себи како да пажљиво одржавам своје покер лице. Помислите, да, момци су кул, а онда се вратите и петљате са овим базама података од више терабајта. А ово је бити јуниор. Можете ли замислити какав је ово ударац?

Знам више од 20 програмских језика. Ово је нешто што сам морао да схватим док сам радио. Дају вам код у Ерлангу, Ц, Ц++, Луа, Питхон, Руби, нечем другом, и све то морате да исечете. Генерално, морао сам. Није било могуће израчунати тачан број, али негде око 20. број се изгубио.

Пошто сви присутни знају шта су Паралеле и шта радимо, нећу да причам о томе колико смо кул и шта радимо. Рећи ћу вам само да имамо 13 канцеларија широм света, више од 300 запослених, развој у Москви, Талину и на Малти. Ако желите, можете га узети и преселити се на Малту ако је зими хладно и морате загрејати леђа.

Конкретно, наше одељење пише у Питхон-у 2. Ми смо у послу и немамо времена да имплементирамо модерне технологије, па трпимо. Дјанго користимо јер има све, а оно што је било непотребно смо узели и бацили. Такође МиСКЛ, Редис и НГИНКС. Имамо и много других кул ствари. Имамо МонгоДБ, имамо зечеве који трче около, имамо све - али није моје, и ја то не радим.

ОпенРести

причао сам о себи. Хајде да схватимо о чему ћу данас да причам:

  • Шта је ОпенРести и са чиме се једе?
  • Зашто поново измишљати још један точак када имамо Питхон, НодеЈС, ПХП, Го и друге цоол ствари са којима су сви задовољни?
  • И неколико примера из живота. Морао сам доста да скрећем извештај јер ми је требало 3,5 сата, тако да ће бити мало примера.

ОпенРести је НГИНКС. Захваљујући њему, имамо пуноправни веб сервер који је добро написан и брзо ради. Мислим да већина нас користи НГИНКС у производњи. Сви знате да је брз и кул. Направили су цоол синхрони И/О у њему, тако да не морамо ништа да циклирамо, баш као што су они урадили гевент у Питхон-у. Гевент је кул, одличан, али ако напишете Ц код и нешто крене наопако, онда ћете са Гевентом полудети док га отклањате грешака. Имао сам искуство: требало ми је цела два дана да схватим шта је ту пошло по злу. Да неко није копао неколико недеља, пронашао проблем, писао на интернету, а Гугл га није нашао, онда бисмо потпуно полудели.

НГИНКС је већ урадио кеширање и статички садржај. Не морате да бринете како да ово урадите људски, да негде не успорите, да негде не изгубите дескрипторе. Нгинк је веома згодан за примену, не морате да размишљате шта да узмете - ВСГИ, ПХП-ФПМ, Гуницорн, Уницорн. Нгинк је инсталиран, дат админима, они знају да раде са њим. Нгинк обрађује захтеве на структуиран начин. О овоме ћу мало касније. Укратко, има фазу када је само прихватио захтев, када га је обрадио и када је сервирао садржај кориснику.

Нгинк је кул, али постоји један проблем: није довољно флексибилан, чак и са свим кул функцијама које су момци угурали у конфигурацију, упркос ономе што се може конфигурисати. Ова моћ није довољна. Зато су момци са Таобаоа, давно, чини се, пре осам година, уградили Луу у то. Шта то даје?

  • Величина. То је мала. ЛуаЈИТ даје око 100-200 килобајта меморије и минималне перформансе.
  • Брзина. ЛуаЈИТ интерпретер је у многим ситуацијама близак Ц-у, у неким ситуацијама губи од Јаве, у другим га надмашује. Неко време се сматрао најсавременијим, најбољим ЈИТ компајлером. Сада постоје хладнији, али су веома тешки, на пример, исти В8. Неки ЈС тумачи и Јава ХотСпот су у неким тренуцима бржи, али на неким местима и даље губе.
  • Лако научити. Ако имате, рецимо, базу Перл кодова, а нисте Боокинг, нећете наћи Перл програмере. Пошто не постоје, сви су одузети, а подучавати их је дуго и тешко. Ако желите програмере за нешто друго, можда ћете морати да их поново обучите или пронађете. У случају Луа, све је једноставно. Сваки јуниор може научити Луа за три дана. Требало ми је око два сата да то схватим. Два сата касније већ сам писао код у продукцији. Отприлике недељу дана касније отишао је право у производњу и отишао.

Као резултат, то изгледа овако:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Овде има много тога. ОпенРести је прикупио гомилу модула, и луасх и енгине. И имате све спремно - распоређено и ради.

Примери

Доста стихова, пређимо на код. Ево мало Хелло Ворлд:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Шта је ту? Ово је локација у Енгинсу. Не бринемо, не пишемо сопствену рутацију, не узимамо неку готову – већ имамо у НГИНКС-у, живимо добрим и лењим животом.

content_by_lua_block је блок који каже да сервирамо садржај користећи Луа скрипту. Узимамо Енгинсову променљиву remote_addr и стави га унутра string.format. То је исто као sprintf, само у Луа, само исправно. И дајемо га клијенту.

Као резултат, то ће изгледати овако:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Али вратимо се у стварни свет. Нико не примењује Хелло Ворлд у производњу. Наша апликација обично иде у базу података или негде другде и већину времена чека на одговор.

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Он само седи и чека. Није баш добро. Када дође 100.000 корисника, јако нам је тешко. Дакле, хајде да користимо једноставну апликацију као пример. Тражићемо слике, на пример, мачака. Али нећемо само претраживати, већ ћемо проширити кључне речи и, ако је корисник тражио „мачићи“, наћи ћемо мачке, крзнене мачке и тако даље. Прво, морамо да добијемо податке захтева на позадину. изгледа овако:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Две линије вам омогућавају да покупите ГЕТ параметре, без компликација. Затим, рецимо, из базе података са знаком за кључну реч и екстензију, добијамо ове информације користећи обичан СКЛ упит. То је једноставно. изгледа овако:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Повезивање библиотеке resty.mysql, који већ имамо у комплету. Не морамо ништа да инсталирамо, све је спремно. Наводимо како да се повежете и направите СКЛ упит:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Овде је мало страшно, али све функционише. Овде је 10 граница. Извлачимо 10 уноса, лењи смо, не желимо да приказујемо више. Заборавио сам на ограничење у СКЛ-у.

Затим ћемо пронаћи слике за све упите. Прикупљамо гомилу захтева и попуњавамо Луа табелу под називом reqs, и ми то радимо ngx.location.capture_multi.

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Сви ови захтеви се шаљу паралелно, а одговори нам се враћају. Време рада је једнако времену одзива најспоријег. Ако сви пуцамо за 50 милисекунди, а послали смо стотину захтева, онда ћемо добити одговор за 50 милисекунди.

Пошто смо лењи и не желимо да пишемо ХТТП и руковање кеширањем, натераћемо НГИНКС да уради све уместо нас. Као што сте видели, постојао је захтев за url/fetch, Овде је:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Ми то чинимо једноставним proxy_pass, указујемо где да кеширамо, како да то урадимо, и све ради за нас.

Али ово није довољно, још увек морамо дати податке кориснику. Најједноставнија идеја је серијализирати све у ЈСОН-у, лако, у два реда. Дајемо Цонтент-Типе, дајемо ЈСОН.

Али постоји једна потешкоћа: корисник не жели да чита ЈСОН. Морамо привући фронт-енд програмере. Понекад у почетку не желимо ово да урадимо. А стручњаци за СЕО ће рећи да ако тражимо слике, онда им то није важно. А ако им дамо неки садржај, они ће рећи да наши претраживачи ништа не индексирају.

Шта учинити поводом тога? Наравно, кориснику ћемо дати ХТМЛ. Ручно генерисање није цомме ил фаут, па желимо да користимо шаблоне. За ово постоји библиотека lua-resty-template.

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Вероватно сте видели три застрашујућа слова ОПМ. ОпенРести долази са сопственим менаџером пакета, преко којег можете инсталирати гомилу различитих модула, посебно, lua-resty-template. Ово је једноставан механизам за шаблоне, сличан Дјанго шаблонима. Тамо можете написати код и извршити замену променљивих.

Као резултат, све ће изгледати отприлике овако:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Узели смо податке и приказали шаблон, поново у два реда. Корисник је срећан, добио је мачке. Пошто смо проширили захтев, добио је и фоку за мачиће. Никад се не зна, можда је управо то тражио, али није могао правилно да формулише свој захтев.

Све је супер, али ми смо у развоју и још не желимо да то покажемо корисницима. Урадимо овлашћење. Да бисмо то урадили, погледајмо како НГИНКС обрађује захтев у терминима ОпенРести:

  • Прва фаза - приступ, када је корисник управо стигао, а ми смо га погледали по заглављима, по ИП адреси и другим подацима. Можемо га одмах прекинути ако нам се не свиђа. Ово се може користити за ауторизацију, или ако примимо много захтева, лако их можемо прекинути у овој фази.
  • преписати. Преписујемо неке податке захтева.
  • садржина. Испоручујемо садржај кориснику.
  • филтер заглавља. Замењујемо заглавља одговора. Ако бисмо користили proxy_pass, можемо преписати нека заглавља пре него што их дамо кориснику.
  • филтер за тело. Можемо променити тело.
  • пријавите се — логгинг. Можете писати дневнике у еластицсеарцх без додатног слоја.

Наше овлашћење ће изгледати отприлике овако:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Овом ћемо додати location, који смо описали раније, и тамо ставите следећи код:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Гледамо да видимо да ли имамо токен колачића. Ако не, онда тражимо овлашћење. Корисници су лукави и могу погодити да треба да поставе токен колачића. Стога ћемо га такође ставити у Редис:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Код за рад са Редис-ом је веома једноставан и не разликује се од других језика. У исто време, сав улаз/излаз, ту и тамо, није блокиран. Ако пишете синхрони код, он ради асинхроно. Скоро као гевент, али добро урађено.

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Урадимо само овлашћење:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Кажемо да треба да прочитамо тело захтева. Примамо ПОСТ аргументе и проверавамо да ли су логин и лозинка исправни. Ако су нетачни, оспоравамо вас за ауторизацију. И ако је тачно, онда напишите токен у Редис:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Не заборавите да поставите колачић, то се такође ради у два реда:

ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Пример је једноставан и спекулативан. Наравно, нећемо правити сервис који људима показује мачке. Али ко нас зна. Дакле, хајде да пређемо на оно што се може урадити у производњи.

  • Минималистички бацкенд. Понекад треба да избацимо само мало података у позадину: негде треба да убацимо датум, негде треба да прикажемо листу, кажемо колико је корисника тренутно на сајту, приложимо бројач или статистику. Нешто тако мало. Неки минимални комади могу се направити врло лако. Ово ће учинити брзо, лако и сјајно.
  • Предобрада података. Понекад желимо да уградимо оглашавање на нашу страницу, а примамо ово оглашавање помоћу АПИ захтева. Ово је веома лако урадити овде. Не учитавамо наш бацкенд који већ седи и напорно ради. Можете га преузети и преузети овде. Можемо спојити неки ЈС или, обрнуто, одвојити га и претходно обрадити нешто пре него што га дамо кориснику.
  • Фасада за микросервис. Ово је такође веома добар случај, имплементирао сам га. Пре тога сам радио у Тензору, компанији која се бави електронским извештавањем и извештава приближно половину правних лица у земљи. Направили смо сервис, многе ствари су тамо рађене користећи исти механизам: рутирање, ауторизација и друго.
    ОпенРести се може користити као лепак за ваше микросервисе, пружајући јединствен приступ свему и јединствен интерфејс. Пошто се микросервис може написати на такав начин да имате Ноде.јс овде, ПХП овде, Питхон овде, нешто Ерланг овде, разумемо да не желимо да преписујемо исти код свуда. Стога се ОпенРести може прикључити на предњу страну.

  • Статистика и аналитика. Обично је НГИНКС на улазу и сви захтеви пролазе кроз њега. На овом месту је веома згодно сакупљати. Можете одмах нешто израчунати и отпремити негде, на пример, Еластицсеарцх, Логстасх, или једноставно то записати у дневник, а затим послати негде.
  • Вишекориснички системи. На пример, онлајн игре су такође веома добре за прављење. Данас у Кејптауну, Алекандер Гладисх ће говорити о томе како брзо направити прототип игре за више играча користећи ОпенРести.
  • Филтрирање захтева (ВАФ). Данас је модерно правити све врсте заштитних зидова за веб апликације; постоји много услуга које их пружају. Користећи ОпенРести, можете себи да направите заштитни зид за веб апликације који ће једноставно и лако филтрирати захтеве према вашим захтевима. Ако имате Питхон, онда разумете да ПХП дефинитивно неће бити убризган у вас, осим ако га, наравно, не покренете било где са конзоле. Знате да имате МиСКЛ и Питхон. Вероватно би могли да покушају да ураде неку врсту обиласка директоријума и убаце нешто у базу података. Због тога можете брзо и јефтино филтрирати чудне упите одмах на почетку.
  • Заједница. Пошто је ОпенРести изграђен на НГИНКС-у, има бонус - ово НГИНКС заједница. Веома је велика и пристојан део питања која ћете имати у почетку већ је решила НГИНКС заједница.

    Луа програмери. Јуче сам разговарао са момцима који су дошли на ХигхЛоад++ тренинг дан и чули да је само Тарантоол написан на Луа. Ово није тачно, много тога је написано на Луи. Примери: ОпенРести, Просоди КСМПП сервер, Лове2Д гаме енгине, Луа скриптован у Варцрафт-у и другде. Постоји много Луа програмера, они имају велику заједницу која реагује. Сва моја Луа питања су решена у року од неколико сати. Када пишете на маилинг листу, буквално у року од неколико минута већ постоји гомила одговора који описују шта и како, шта је шта. То је супер. Нажалост, таква љубазна, духовна заједница није свуда.
    Постоји ГитХуб за ОпенРести, где можете отворити проблем ако је нешто покварено. Постоји мејлинг листа на Гоогле групама, где можете да разговарате о општим питањима, постоји мејлинг листа на кинеском - никад се не зна, можда не говорите енглески, али знате кинески.

Резултати

  • Надам се да сам успео да пренесем да је ОпенРести веома згодан оквир скројен за веб.
  • Има ниску баријеру за улазак, пошто је код сличан ономе на коме пишемо, језик је прилично једноставан и минималистички.
  • Обезбеђује асинхрони И/О без повратних позива, нећемо имати никакве резанце као што понекад можемо да напишемо у НодеЈС-у.
  • Лако се примењује, пошто нам је потребан само НГИНКС са потребним модулом и нашим кодом, и све ради одмах.
  • Велика и одговорна заједница.

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

Спасибо за внимание!


Владимир Протасов - ОпенРести: претварање НГИНКС-а у пуноправни сервер апликација

Извор: ввв.хабр.цом

Додај коментар