OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakkeMun sake buga kwafin rahoton daga taron HighLoad++ 2016, wanda aka gudanar a Skolkovo kusa da Moscow a kan Nuwamba 7-8 na bara. Vladimir Protasov yana bayyana yadda ake tsawaita ayyukan NGINX tare da OpenResty da Lua.

Sannu kowa da kowa, sunana Vladimir Protasov, Ina aiki don daidaici. Zan gaya muku kadan game da kaina. Ina kashe kashi uku cikin hudu na rayuwata rubuta code. Na zama mai tsara shirye-shirye har zuwa ainihin ma'ana: Wani lokaci ina ganin lamba a cikin mafarkina. Kwata na rayuwa shine ci gaban masana'antu, lambar rubutun da ke shiga kai tsaye zuwa samarwa. Lambar da wasunku ke amfani da ita amma ba ku sani ba.

Don sanar da ku yadda abin ya kasance. Lokacin da nake karama, na shigo suka ba ni wadannan bayanan terabyte guda biyu. Yanzu yana nan don kowa da kowa. Na je taro kuma na tambayi: “Maza, gaya mani, kuna da manyan bayanai, komai yana da kyau? Tushen nawa kuke da su a wurin? Suka amsa mini: "Muna da gigabytes 100!" Na ce: "Cool, 100 gigabytes!" Kuma na yi tunani a kaina yadda zan iya ajiye fuskar poker da kyau. Kuna tsammani, eh, mutanen suna da sanyi, sannan ku dawo ku yi tinker tare da waɗannan bayanan bayanan terabyte masu yawa. Kuma wannan shi ne zama junior. Za ku iya tunanin abin da bugun ta ke?

Na san harsunan shirye-shirye sama da 20. Wannan shi ne abin da dole ne in gano a yayin aikin. Ana ba ku lamba a Erlang, a cikin C, a cikin C++, cikin Lua, a cikin Python, cikin Ruby, a cikin wani abu dabam, kuma dole ne ku yanke duka. Gabaɗaya, dole ne in yi. Ba a iya ƙididdige ainihin adadin ba, amma a wani wuri kusan 20 lambar ta ɓace.

Tun da kowa a nan ya san menene Parallels da abin da muke yi, ba zan yi magana game da yadda muke sanyi da abin da muke yi ba. Zan gaya muku kawai cewa muna da ofisoshin 13 a duniya, fiye da ma'aikata 300, ci gaba a Moscow, Tallinn da Malta. Idan kuna so, zaku iya ɗauka ku ƙaura zuwa Malta, idan sanyi ne a cikin hunturu kuma kuna buƙatar dumama baya.

Musamman, sashenmu yana rubutu a Python 2. Muna cikin kasuwanci kuma ba mu da lokacin gabatar da fasahar zamani, don haka muna shan wahala. Muna da Django, domin yana da komai, kuma mun dauki abin da ya wuce kima muka jefar. Hakanan MySQL, Redis da NGINX. Hakanan muna da sauran abubuwa masu daɗi da yawa. Muna da MongoDB, muna da zomaye suna yawo, ba mu da komai - amma ba nawa ba ne, kuma ba na yin shi.

OpenResty

Na fada game da kaina. Bari mu ga abin da zan yi magana akai a yau:

  • Menene OpenResty kuma menene ake ci dashi?
  • Me yasa sake sabunta dabaran yayin da muke da Python, NodeJS, PHP, Go da sauran kyawawan abubuwa waɗanda kowa ke farin ciki da su?
  • Kuma 'yan misalai na rayuwa na gaske. Dole ne in rage rahoton da yawa, saboda na samu na tsawon sa'o'i 3,5, don haka za a sami 'yan misalai.

OpenResty shine NGINX. Godiya gare shi, muna da cikakken sabar gidan yanar gizo, wanda aka rubuta da kyau, yana aiki da sauri. Ina tsammanin yawancin mu suna amfani da NGINX a samarwa. Kun san cewa yana da sauri da sanyi. Sun yi I / O mai sanyi a ciki, don haka ba ma buƙatar yin keken wani abu kamar yadda aka yi keken keke a Python. Gevent yana da sanyi, sanyi, amma idan kun rubuta C-code kuma wani abu ba daidai ba tare da gevent, zaku yi hauka don gyara shi. Na sami gogewa: ya ɗauki kwanaki biyu gaba ɗaya don gano abin da ba daidai ba a can. Idan da a ce wani bai tona wasu makonni ba, ya gano matsalar, ya rubuta ta a Intanet, kuma Google bai same ta ba, da mun yi hauka kwata-kwata.

NGINX ya riga ya yi caching da abun ciki a tsaye. Ba kwa buƙatar damuwa da yadda za ku yi ta mutum, don kada ku rage wani wuri, don kada ku rasa masu bayyanawa a wani wuri. Nginx ya dace sosai don turawa, ba kwa buƙatar yin tunanin abin da za ku ɗauka - WSGI, PHP-FPM, Gunicorn, Unicorn. An shigar da Nginx, an ba wa admins, sun san yadda ake aiki da shi. Nginx yana aiwatar da buƙatun ta hanyar da aka tsara. Zan yi magana game da wannan kadan daga baya. A takaice, yana da lokaci lokacin da kawai ya karɓi buƙatun, lokacin da ya aiwatar da lokacin da ya ba da abun ciki ga mai amfani.

Nginx yana da kyau, amma akwai matsala guda ɗaya: ba ta da sauƙi ko da tare da duk waɗannan fasalulluka masu kyau waɗanda mutanen suka tura cikin tsarin, duk da cewa ana iya keɓance shi. Wannan iko bai isa ba. Saboda haka, mutanen Taobao sau ɗaya, ina tsammanin kimanin shekaru takwas da suka wuce, sun gina Lua a ciki. Me yake bayarwa?

  • size. Yana da karami. LuaJIT yana ba da wani wuri kusan kilobytes 100-200 na ƙwaƙwalwar ajiya da ƙaramin aiki sama da ƙasa.
  • Speed. Mai fassarar LuaJIT yana kusa da C a yanayi da yawa, a wasu yanayi ya yi hasarar Java, a wasu kuma ya riske shi. Na ɗan lokaci, an ɗauke shi yanayin fasaha, mafi kyawun mai tarawa JIT. Yanzu akwai masu sanyaya, amma suna da nauyi sosai, misali, V8 iri ɗaya. Wasu masu fassarar JS da Java HotSpot suna da sauri a wasu wuraren, amma har yanzu suna rasa a wasu wuraren.
  • Sauƙi don koyo. Idan kana da, ka ce, lambar lambar Perl kuma ba ka Buɗewa, ba za ka sami masu shirye-shiryen Perl ba. Domin ba su nan, an ɗauke su duka, kuma yana da tsawo da wuya a koya musu. Idan kana son masu shirye-shirye don wani abu dabam, ƙila kuma a sake horar da su ko a same su. A cikin al'amarin Lua, komai yana da sauƙi. Duk wani ƙarami zai iya koyan Lua a cikin kwanaki uku. Sai da na kai kimanin awa biyu kafin na gano hakan. Bayan sa'o'i biyu, na riga na rubuta lambar a samarwa. Bayan kamar sati daya, kai tsaye yaje wajen samarwa ya tafi.

A sakamakon haka, yana kama da haka:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Akwai da yawa a nan. OpenResty ya tattara gungun kayayyaki, duka luash da ingins. Kuma kuna da komai a shirye - ƙaddamar da aiki.

misalai

Isasshen waƙoƙin, bari mu matsa zuwa lambar. Ga ‘yar Sannu Duniya:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Menene akwai? wannan shine wurin injina. Ba mu damu ba, ba ma rubuta hanyarmu ba, ba ma ɗaukar wani shiri da aka yi - mun riga mun sami shi a cikin NGINX, muna rayuwa da kyau da kasala.

content_by_lua_block toshe ne da ke cewa muna ba da abun ciki ta amfani da rubutun Lua. Muna ɗaukar madaidaicin injuna remote_addr da zamewa a ciki string.format. Wannan daidai yake da sprintf, kawai a cikin Lua, kawai daidai. Kuma muna ba abokin ciniki.

A sakamakon haka, zai kasance kamar haka:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Amma koma ga hakikanin duniya. A cikin samarwa, babu wanda ke tura Hello World. Aikace-aikacen mu yawanci yana zuwa rumbun adana bayanai ko wani wuri kuma galibi yana jiran amsa.

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Zauna kawai yayi yana jira. Ba shi da kyau sosai. Lokacin da masu amfani 100.000 suka zo, yana da wuya a gare mu. Saboda haka, bari mu yi amfani da sauki aikace-aikace a matsayin misali. Za mu nemo hotuna, alal misali, kuliyoyi. Sai kawai ba za mu bincika kawai ba, za mu faɗaɗa mahimman kalmomin kuma, idan mai amfani ya nemi "kittens", za mu sami kuliyoyi, fulffies, da sauransu. Da farko muna buƙatar samun bayanan buƙatun akan bangon baya. Ga alama kamar haka:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Layuka biyu suna ba ku damar ɗaukar sigogi na GET, babu rikitarwa. Sannan mu, alal misali, muna samun wannan bayanin daga rumbun adana bayanai tare da tebur ta keyword da tsawo ta amfani da tambayar SQL na yau da kullun. Komai mai sauki ne. Ga alama kamar haka:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Muna haɗa ɗakin karatu resty.mysql, wanda muke da shi a cikin kit ɗin. Ba mu buƙatar shigar da komai, komai yana shirye. Ƙayyade yadda ake haɗawa da yin tambayar SQL:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Yana da ɗan ban tsoro, amma yana aiki. Anan 10 shine iyaka. Muna fitar da rikodin guda 10, muna da kasala, ba ma son nuna ƙari. A cikin SQL, na manta game da iyaka.

Sannan muna samun hotuna don duk tambayoyin. Muna tattara buƙatun buƙatun kuma mu cika teburin Lua da ake kira reqs, kuma yi ngx.location.capture_multi.

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Duk waɗannan buƙatun suna tafiya a layi daya, kuma ana mayar mana da amsoshin. Lokacin gudu daidai yake da lokacin amsawa mafi hankali. Idan duk muka yi harbi a cikin milliseconds 50, kuma mun aika buƙatun ɗari, to za mu sami amsa a cikin millise seconds 50.

Tun da mun kasala ne kuma ba ma son rubuta sarrafa HTTP da caching, za mu sa NGINX ya yi mana komai. Kamar yadda kuka gani, akwai bukatar url/fetch, ga shi:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Muna yin sauƙi proxy_pass, ƙayyade inda za a cache, yadda za a yi shi, kuma duk abin yana aiki a gare mu.

Amma wannan bai isa ba, har yanzu muna buƙatar ba da bayanan ga mai amfani. Mafi sauƙaƙan ra'ayi shine jera komai zuwa JSON, cikin sauƙi, cikin layi biyu. Muna ba da Nau'in Abun ciki, muna ba JSON.

Amma akwai wahala ɗaya: mai amfani baya son karanta JSON. Muna buƙatar jawo hankalin masu haɓakawa na gaba. Wani lokaci ba ma jin son yin shi da farko. Ee, kuma ƙwararrun SEO za su ce idan muna neman hotuna, to ba su damu ba. Kuma idan muka ba su wasu abubuwan ciki, za su ce injunan bincikenmu ba su nuna alamar komai ba.

Me za ayi dashi? Tabbas, za mu ba mai amfani HTML. Samar da hannaye ba abu ne mai wahala ba, don haka muna son amfani da samfuri. Akwai ɗakin karatu don wannan lua-resty-template.

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Dole ne ku ga haruffan OPM uku masu ban tsoro. OpenResty ya zo tare da manajan kunshin nasa, ta hanyar da zaku iya shigar da gungun kayayyaki daban-daban, musamman, lua-resty-template. Injin samfuri mai sauƙi ne mai kama da samfuran Django. A can za ku iya rubuta lamba kuma ku canza canji.

A sakamakon haka, duk abin da zai zama kamar haka:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Mun ɗauki bayanan kuma mun sake yin samfurin a cikin layi biyu. Mai amfani yana farin ciki, ya sami kuliyoyi. Tun da muka faɗaɗa buƙatar, ya kuma sami hatimin fur don kittens. Ba ka sani ba, watakila yana nema, amma ya kasa tsara bukatarsa ​​daidai.

Komai yana da kyau, amma muna cikin ci gaba, kuma ba mu so mu nuna masu amfani tukuna. Mu yi izini. Don yin wannan, bari mu ga yadda NGINX ke sarrafa buƙatun dangane da OpenResty:

  • Kashi na farko - access, lokacin da mai amfani kawai ya zo, kuma mun dube shi ta hanyar kai, ta adireshin IP, ta wasu bayanai. Kuna iya yanke shi nan da nan idan ba mu son shi. Ana iya amfani da wannan don ba da izini, ko kuma idan mun sami buƙatun da yawa, za mu iya yanke su cikin sauƙi a wannan lokacin.
  • sake rubutawa. Sake rubuta wasu bayanan buƙatun.
  • abun ciki. Muna ba da abun ciki ga mai amfani.
  • tace kai. Canja taken martani. Idan mun yi amfani proxy_pass, za mu iya sake rubuta wasu rubutun kafin mu ba wa mai amfani.
  • tace jiki. Za mu iya canza jiki.
  • shiga - shiga. Yana yiwuwa a rubuta rajistan ayyukan a elasticsearch ba tare da ƙarin Layer ba.

Izinin mu zai yi kama da haka:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Za mu ƙara shi zuwa wancan location, wanda muka yi bayaninsa a baya, kuma muka sanya lambar a can:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Muna duba don ganin ko muna da alamar kuki. Idan ba haka ba, to muna jefa kan izini. Masu amfani suna da wayo kuma suna iya tunanin cewa ana buƙatar saita alamar kuki. Don haka, za mu kuma sanya shi a cikin Redis:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Lambar don aiki tare da Redis abu ne mai sauqi kuma baya bambanta da sauran harsuna. A lokaci guda, duk shigarwa / fitarwa, abin da ke wurin, abin da ke nan, ba ya toshewa. Idan ka rubuta lambar aiki tare, to tana aiki asynchronously. Kamar tare da gevent, kawai an yi kyau.

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Mu yi izini da kanta:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Mun ce muna buƙatar karanta ƙungiyar buƙatar. Muna karɓar gardamar POST, bincika cewa shiga da kalmar wucewa daidai ne. Idan ba daidai ba, to muna jefa kan izini. Kuma idan sun yi daidai, to sai mu rubuta alamar zuwa Redis:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Kar a manta da saita kuki, ana yin wannan kuma cikin layi biyu:

OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke

Misali mai sauƙi ne, hasashe. Tabbas, ba za mu yi sabis ɗin da ke nuna kuliyoyi ga mutane ba. Amma wa ya san mu. Don haka bari mu ga abin da za a iya yi a samarwa.

  • Mafi ƙarancin baya. Wani lokaci muna buƙatar ba da cikakkun bayanai zuwa bayanan baya: wani wuri muna buƙatar musanya kwanan wata, wani wuri muna buƙatar nuna wasu nau'ikan jeri, faɗi yawan masu amfani da rukunin yanar gizon yanzu, dunƙule kan tebur ko ƙididdiga. Wani abu karami. Ana iya yin wasu ƙananan guntuwa cikin sauƙi. Wannan zai zama mai sauri, sauƙi kuma mai girma.
  • Ana aiwatar da bayanai. Wani lokaci muna son saka tallace-tallace a cikin shafinmu, kuma muna ɗaukar waɗannan tallace-tallace tare da buƙatun API. Wannan yana da sauƙin yi a nan. Ba mu loda kayan baya, wanda ke aiki tuƙuru. Kuna iya karba ku tattara anan. Za mu iya ƙirƙira wasu JS ko, akasin haka, rashin tsayawa, tsara wani abu kafin mu ba mai amfani.
  • Facade don microservice. Wannan kuma lamari ne mai kyau, na aiwatar da shi. Kafin wannan, na yi aiki da Tenzor, kamfanin ba da rahoto na lantarki wanda ke ba da rahoton kusan rabin hukumomin doka a ƙasar. Mun yi sabis, ana yin abubuwa da yawa a can ta amfani da tsari iri ɗaya: tuƙi, izini, da ƙari.
    Ana iya amfani da OpenResty azaman manne don ƙananan sabis ɗin ku don samar da dama guda ɗaya zuwa komai da keɓantaccen mahalli. Tun da ana iya rubuta microservices ta hanyar da za ku sami Node.js a nan, kuna da PHP a nan, kuna da Python a nan, akwai wani abu Erlang a nan, mun fahimci cewa ba ma so mu sake rubuta wannan lambar a ko'ina. Don haka, ana iya shigar da OpenResty a gaba.

  • Kididdiga da nazari. Yawancin lokaci NGINX yana a ƙofar, kuma duk buƙatun suna wucewa ta ciki. A wannan wuri ne ya fi dacewa don tattarawa. Kuna iya ƙididdige wani abu nan da nan kuma ku jefa shi wani wuri, misali, Elasticsearch iri ɗaya, Logstash, ko kawai rubuta shi zuwa log ɗin sannan aika shi wani wuri.
  • Multi-User Systems. Misali, wasannin kan layi ma suna da kyau a yi. A yau a Cape Town Alexander Gladysh zai gaya muku yadda ake saurin yin samfura na wasan wasa da yawa ta amfani da OpenResty.
  • Neman Tace (WAF). Yanzu ya zama na zamani don yin kowane nau'in wutan lantarki na aikace-aikacen yanar gizo, akwai ayyuka da yawa waɗanda ke samar da su. Tare da taimakon OpenResty, zaku iya sanya kanku tacewar zaɓi na aikace-aikacen yanar gizo, wanda zai sauƙaƙe kuma cikin sauƙi tace buƙatun gwargwadon buƙatunku. Idan kuna da Python, to kun fahimci cewa ba shakka ba za a yi muku allurar PHP ba, sai dai idan, ba shakka, kun shuka shi a ko'ina daga na'urar. Kun san kuna da MySQL da Python. Wataƙila, a nan za su iya ƙoƙarin yin wani nau'i na kundin adireshi da kuma shigar da wani abu a cikin bayanan. Don haka, zaku iya tace buƙatun bebe cikin sauri da arha dama a gaba.
  • Al'umma. Tunda OpenResty ya dogara akan NGINX, yana da kari - wannan shine NGINX al'umma. Yana da girma sosai, kuma yawancin tambayoyin da za ku yi da farko an riga an amsa su daga al'ummar NGINX.

    Lua masu haɓakawa. Jiya na yi magana da mutanen da suka zo ranar horo na HighLoad ++ kuma na ji cewa Tarantool kawai aka rubuta a cikin Lua. Wannan ba haka ba ne, an rubuta abubuwa da yawa a cikin Lua. Misalai: OpenResty, Prosody XMPP uwar garken, Love2D inji wasan, Lua an rubuta shi a cikin Warcraft da sauran wurare. Akwai masu haɓaka Lua da yawa, suna da al'umma mai girma da jin daɗi. An amsa duk tambayoyina na Lua a cikin 'yan sa'o'i kaɗan. Lokacin da kuka rubuta zuwa jerin aikawasiku, a zahiri a cikin ƴan mintuna an riga an sami ɗimbin amsoshi, suna bayyana menene kuma ta yaya, menene. Yana da kyau. Abin takaici, irin wannan al'umma mai gaskiya ba ta ko'ina.
    OpenResty yana da GitHub, inda zaku iya buɗe batun idan wani abu ya karye. Akwai jerin aikawasiku a Rukunin Google inda za ku iya tattauna batutuwa na gaba ɗaya, akwai jerin aikawasiku cikin Sinanci - ba ku taɓa sani ba, wataƙila ba ku jin Turanci, amma kuna da ilimin Sinanci.

Sakamakon

  • Ina fata na sami damar isar da cewa OpenResty shine tsarin gidan yanar gizo mai dacewa sosai.
  • Yana da ƙananan ƙofar shigarwa, tun da lambar ta yi kama da abin da muke rubutawa, harshen yana da sauƙi kuma kadan.
  • Yana bayar da asynchronous I/O ba tare da sake kira ba, ba za mu sami noodles ba kamar yadda wani lokaci muna iya rubutawa a NodeJS.
  • Yana da sauƙi mai sauƙi, saboda kawai muna buƙatar NGINX tare da madaidaicin tsari da lambar mu, kuma komai yana aiki nan da nan.
  • Al'umma mai girma da amsawa.

Ban yi dalla-dalla yadda ake yin kwatance ba, ya zama dogon labari.

Na gode da hankali!


Vladimir Protasov - OpenResty: juya NGINX zuwa uwar garken aikace-aikacen cikakke

source: www.habr.com

Add a comment