
Serverless ei tĂ€henda fĂŒĂŒsiliste serverite puudumist. See ei ole konteinerite «tapja» ega ajutine trend. See on uus lĂ€henemine sĂŒsteemide ehitamisele pilves. TĂ€na vaatame Serverless-rakenduste arhitektuuri, uurime, millist rolli mĂ€ngib Serverless-teenuste pakkuja ja open-source projektid. LĂ”puks arutame, kuidas Serverless'i rakendusi kasutada.
Ma tahan kirjutada rakenduse serveripoolset osa (isegi kui see on internetipood). See vĂ”ib olla vestlus, sisu avaldamise teenus vĂ”i koormuse tasakaalustaja. Igatahes tuleb tegeleda paljude muredega: tuleb ette valmistada infrastruktuur, mÀÀrata rakenduse sĂ”ltuvused, mĂ”elda hosti operatsioonisĂŒsteemile. Siis tuleb uuendada vĂ€ikseid komponente, mis ei mĂ”juta ĂŒlejÀÀnud monoliiti. Ja Ă€rgem unustagem koormuse jĂ€rgi skaleerimist.
Aga mis siis, kui vĂ”tta efemeerseid konteinereid, milles vajalikud sĂ”ltuvused on juba eelnevalt installitud, ning need konteinerid on ĂŒksteisest ja hosti opsĂŒsteemist eraldatud? Jagame monoliidi mikroteenusteks, millest igaĂŒht saab uuendada ja skaleerida sĂ”ltumatult teistest. Paigutades koodi sellisesse konteinerisse, saan seda kĂ€ivitada igasuguses infrastruktuuris. See on juba parem.
Aga kui ei taha konteinereid seadistada? Ei taha mÔelda rakenduse skaleerimisele. Ei taha maksta kÀivitatud konteinerite ootamise eest, kui teenusele on minimaalne koormus. Tahan lihtsalt koodi kirjutada. Keskenduda Àri loogikale ja tuua tooted turule tuulekiirusel.
Sellised mĂ”tted viisid mind serverivabade arvutuste juurde. Serverless tĂ€henduses tĂ€hendab see mitte fĂŒĂŒsiliste serverite puudumist, vaid muret infrastruktuuri haldamise puudumisest.
Idee seisneb selles, et rakenduse loogika jaguneb sĂ”ltumatuteks funktsioonideks. Need on sĂŒndmustepĂ”hised. Iga funktsioon tĂ€idab ĂŒhte «mikrotegevust». KĂ”ik, mida arendajalt nĂ”utakse, on laadida funktsioonid pilveteenuse pakkuja konsooli ja seostada need sĂŒndmuste allikatega. Kood kĂ€ivitatakse nĂ”udmisel automaatselt ette valmistatud konteineris ning maksan ainult kĂ€ivitamise aja eest.
Vaatame nĂŒĂŒd, kuidas arenduse protsess vĂ€lja nĂ€eb.
Arendaja vaatepunktist
Varem rÀÀkisime e-poe rakendusest. Traditsioonilises lĂ€henemisviisis tĂ€idab sĂŒsteemi pĂ”hiloogika monoliitne rakendus. Ja server, kus rakendus on pidevalt kĂ€ivitatud, töötab pidevalt, isegi kui koormust pole.
Serverless lahendusele ĂŒlemineku jaoks jagame rakenduse mikrotegevusteks. IgaĂŒhe jaoks kirjutame oma funktsiooni. Funktsioonid on ĂŒksteisest sĂ”ltumatud ja ei salvesta olekut (stateless). Need vĂ”ivad olla kirjutatud isegi erinevates keeltes. Kui ĂŒks neist âkukubâ, ei peatu kogu rakendus. Rakenduse arhitektuur nĂ€eb vĂ€lja selline:

Funktsioonide jaotamine Serverless'is sarnaneb mikroteenustega töötamisega. Kuid mikroteenus vĂ”ib tĂ€ita mitmeid ĂŒlesandeid, samas kui funktsioon peaks ideaalis tĂ€itma vaid ĂŒht. Kujutage ette, et ĂŒlesanne on koguda statistikat ja esitada see kasutaja pĂ€ringu jĂ€rgi. Mikroteenuse lĂ€henemisviisis tĂ€idab ĂŒlesande ĂŒks teenus, millel on kaks sisendpunkti: kirjutamiseks ja lugemiseks. Besserveritaseme arvutustes on need kaks eraldi funktsiooni, mis ei ole omavahel seotud. Arendaja sÀÀstab arvutusressursse, kui nĂ€iteks statistikat uuendatakse sagedamini kui seda laaditakse.
Serverless-funktsioonid peavad töötama lĂŒhikese aja jooksul (timeout), mille mÀÀrab teenuse pakkuja. NĂ€iteks AWS puhul on timeout 15 minutit. See tĂ€hendab, et pikaajalised funktsioonid (long-lived) tuleb kohandada nĂ”uete jĂ€rgi â sellega erineb Serverless teistest praegu populaarsetest tehnoloogiatest (nagu konteinerid ja Platform as a Service).
Iga funktsioonile mÀÀrame sĂŒndmuse. SĂŒndmus on tegevuse vĂ€ljakutsuja:
SĂŒndmus
Tegevus, mida funktsioon tÀidab
Toote pilt on salvestatud salvestusruumi
Pildistada pilt ja laadida see kataloogi
Andmebaasis on uuendatud fĂŒĂŒsilise poe aadress
Uue asukoha laadimine kaartidele
Klient maksab toote eest
KÀivitada makse töötlemine
SĂŒndmusteks vĂ”ivad olla HTTP-pĂ€ringud, voogedastuse andmed, sĂ”numijĂ€rjed jne. SĂŒndmuste allikad on andmete muutumine vĂ”i ilmumine. Samuti saab funktsioone kĂ€ivitada ajastatult.
Arhitektuur on lÀbi töötatud ja rakendus on peaaegu serverless. Edasi liikume teenuse pakkuja poole.
Teenuse pakkuja poolt
Tavaliselt pakuvad serverless arvutusi pilveteenuse pakkujad. Neid nimetatakse erinevalt: Azure Functions, AWS Lambda, Google Cloud Functions, IBM Cloud Functions.
Teenust kasutame lĂ€bi teenusepakkuja konsooli vĂ”i isikliku konto. Funktsioonide koodi saab laadida ĂŒhe jĂ€rgmistest viisidest:
- koodi kirjutada sisseehitatud redaktorites lÀbi veebikonsooli,
- laadida koodi arhivina,
- töötada avalike vÔi privaatsed git-repositooretega.
Siin seadistame sĂŒndmused, mis kutsuvad funktsiooni esile. Erinevate teenusepakkujate sĂŒndmuste kogumid vĂ”ivad erineda.

Teenusepakkuja on oma infrastruktuuri ĂŒles ehitanud ja automatiseerinud Function as a Service (FaaS) sĂŒsteemi:
- Funktsioonide kood jÔuab teenusepakkuja salvestusruumi.
- Kui sĂŒndmus tekib, kĂ€ivitatakse serveris automaatselt konteinerid, millel on ettevalmistatud keskkond. Iga funktsiooni eksemplarile on oma isoleeritud konteiner.
- Salvestusruumist saadetakse funktsioon konteinerisse, arvutatakse ja antakse tulemus.
- Paralleelsete sĂŒndmuste arv kasvab â kasvab ka konteinerite arv. SĂŒsteem skaleerib automaatselt. Kui kasutajad ei kasuta funktsiooni, jÀÀb see mitteaktiivseks.
- Teenusepakkuja mÀÀrab konteinerite ooteaja â kui selle aja jooksul funktsioonid konteineris ei ilmu, hĂ€vitatakse see.
Nii saame Serverless'i "karbist vÀlja". Teenuse eest maksame pay-as-you-go mudeli jÀrgi ja ainult nende funktsioonide eest, mida kasutame, ja ainult selle aja eest, kui neid kasutati.
Kuna arendajad teenusega tutvuda, pakuvad teenusepakkujad kuni 12 kuud tasuta katsetamist, kuid piiravad arvutusaega, kuude pÀringute arvu, rahasummat vÔi tarbitavat vÔimsust.
Peamine eelis koostöös teenusepakkujaga on see, et ei pea muretsema infrastruktuuri (serverite, virtuaalmasinate, konteinerite) pÀrast. Teenusepakkuja vÔib omalt poolt rakendada FaaS-i nii oma arenduste kaudu kui ka open-source tööriistade abil. RÀÀgime neist lÀhemalt.
Open source'i poolelt
Viimase paarikĂŒmne aasta jooksul on open-source kogukond aktiivselt töötanud Serverless-tööriistade kallal. Suured turu mĂ€ngijad panustavad ka besservetete platvormide arendamisse:
- Google pakub arendajatele oma open-source tööriista â . Selle vĂ€ljatöötamisel osalesid IBM, RedHat, Pivotal ja SAP;
- IBM töötas Serverless platvormi kallal , mis sai hiljem Apache Foundation'i projektiks;
- Microsoft osaliselt avasid nad platvormi koodi .
Arendused toimuvad ka serverless-raamistike suunas. ja paigaldatakse eelnevalt ettevalmistatud Kubernetes-klastritesse, töötab nii Kubernetesega kui ka Docker Swarmiga. Raamistik toimib omamoodi kontrollerina â ta valmistab nĂ”udmisel klastris tööaja keskkonna ja kĂ€ivitab seal funktsiooni.
Raamistikud jĂ€tavad ruumi tööriista konfigureerimiseks vastavalt oma vajadustele. Nii vĂ”ib Kubeless arendaja seadistada funktsiooni tĂ€itmise ajapiiri (vaikevÀÀrtus on 180 sekundit). Fission pĂŒĂŒab lahendada kĂŒlma kĂ€ivituse probleemi hoides osa konteineritest alati töös (kuigi see toob kaasa ressursikasutuse kulud). OpenFaaS pakub aga hulgaliselt trigeerijaid igale maitsele: HTTP, Kafka, Redis, MQTT, Cron, AWS SQS, NATs ja teised.
KÀivitamise juhised leiate raamistikute ametlikust dokumentatsioonist. Nende kasutamine eeldab veidi rohkem oskusi kui teenusepakkujaga töötamine - see tÀhendab vÀhemalt oskust kÀivitada Kubernetes-klaster CLI kaudu. Maksimaalselt vÔib kaasata ka teisi avatud lÀhtekoodiga tööriistu (nÀiteks Kafka jÀrjekorrakasutaja).
Olenemata sellest, kuidas me Serverlessiga töötame â kas teenusepakkuja kaudu vĂ”i avatud lĂ€htekoodiga lahendusega, saame serverless-lĂ€henemise mitmeid eeliseid ja puudusi.
Eeliste ja puuduste seisukohalt
Serverless arendab konteineritest ja mikroteenuste lĂ€henemisest tulenevaid ideid, kus meeskonnad saavad töötada mitmem keeles ilma ĂŒhe platvormiga sidumata. SĂŒsteemi ĂŒlesehitamine muutub lihtsamaks ja vigade parandamine kergemaks. Mikroteenuste arhitektuur vĂ”imaldab sĂŒsteemi uue funktsionaalsuse lisamist oluliselt kiiremini kui monoliitsete rakenduste puhul.
Serverless vĂ€hendab veelgi arendusaega, lubades arendajal keskenduda ainult rakenduse Ă€riloogikale ja koodi kirjutamisele. Selle tulemusena lĂŒheneb arenduste turule jĂ”udmise aeg.
Boonuseks on automaatne skaleerimine koormuse jÀrgi, ja maksame ainult kasutatud ressursside eest ja vaid siis, kui neid kasutatakse.
Kuna iga tehnoloogia, on Serverlessel ka puudused.
NĂ€iteks vĂ”ib selliseks puuduseks olla kĂŒlma kĂ€ivituse aeg (keskmiselt kuni 1 sekund selliste keelte jaoks nagu JavaScript, Python, Go, Java, Ruby).
Ăhelt poolt sĂ”ltub kĂŒlma kĂ€ivitamise aeg tegelikult paljusid muutujatest: keel, milles funktsioon on kirjutatud, raamatukogude hulk, koodi maht, suhtlemine lisavahenditega (nĂ€iteks andmebaasid vĂ”i autentimisserverid). Kuna arendaja haldab neid muutujad, vĂ”ib ta kĂ€ivitamisaega lĂŒhendada. Teiselt poolt ei saa arendaja konteineri kĂ€ivitamise aega mĂ”jutada - see sĂ”ltub tĂ€ielikult teenusepakkujast.
KĂŒlm kĂ€ivitamine vĂ”ib muutuda soojaks, kui funktsioon kasutab eelnevalt sama sĂŒndmuse kĂ€ivitatud konteinerit. Selline olukord tekib kolmes olukorras:
- kui kliendid kasutavad teenust sageli ja funktsiooni kÔnetuste arv suureneb;
- kui teenusepakkuja, platvorm vÔi raamistik vÔimaldab osa konteineritest pidevalt kÀivitamata hoida;
- kui arendaja kĂ€ivitab funktsioone ajastuse jĂ€rgi (ĂŒtleme, iga kolme minuti tagant).
Paljude rakenduste jaoks ei ole kĂŒlm kĂ€ivitamine probleem. Siin tuleks lĂ€htuda teenuse tĂŒĂŒbist ja ĂŒlesannetest. KĂ€ivitamise viivitus sekundiks ei pruugi olla Ă€rirakenduse jaoks kriitiline, kuid vĂ”ib olla kriitiline meditsiiniteenuste jaoks. TĂ”enĂ€oliselt ei sobi sellisel juhul serverita lĂ€henemine.
Serverless'i jĂ€rgmise puudusena peetakse funktsiooni lĂŒhikest eluaega (timeout, mille jooksul funktsioon peab soorituma).
Aga kui tuleb töötada pikaajaliste ĂŒlesannetega, vĂ”ib kasutada hĂŒbriidset arhitektuuri - kombineerida Serverless'i muu tehnoloogiaga.
Kuid mitte kĂ”ik sĂŒsteemid ei saa töötada Serverless'i skeemi alusel.
MÔned rakendused jÀtkavad andmete ja oleku hoidmist töötamise ajal. MÔned arhitektuurid jÀÀvad monoliitseteks, samas kui mÔned funktsioonid on pikaealised. Siiski on Serverless (nagu kunagi pilvetehnoloogiad ja seejÀrel konteinerid) tehnoloogia, millel on suur tulevik.
Sellega seoses sooviksin sujuvalt liikuda Serverless'i lĂ€henemise rakendamise kĂŒsimuse juurde.
Rakendamise poolelt
Aastal 2018 suurenes Serverless'i kasutamine . EttevÔtete seas, kes on juba tehnoloogiat oma teenustes rakendanud, on sellised turujuhtivad ettevÔtted nagu Twitter, PayPal, Netflix, T-Mobile, Coca-Cola. Samuti tuleb mÔista, et Serverless ei ole universaalne lahendus, vaid vahend spetsiifiliste probleemide lahendamiseks:
- Ressursside seisaku vÀhendamine. Ei ole vaja pidevalt hoida virtuaalmasinat teenuste jaoks, mida harva kasutatakse.
- Töödelda andmeid "reaalajas". Pildifailide tihendamine, tausta eemaldamine, video kodeeringu muutmine, IoT-anduritega töötamine, matemaatiliste operatsioonide tegemine.
- "Kleebitakse" kokku teiste teenustega. Git-repositoorium siseprogrammidest, Slacki chatbot Jira ja kalendri integreerimisega.
- Koormuse tasakaalustamine. Siin peatume lÀhemalt.
Oletame, et on teenus, kuhu tuleb 50 inimest. Selle jaoks on seadistatud nÔrkade komponentidega virtuaalmasin. Aeg-ajalt koormus teenusele kasvab mitu korda. Sel juhul ei suuda nÔrgad komponendid hakkama saada.
SĂŒsteemi saab lisada koormuse tasakaalustaja, mis jaotab koormust, ĂŒtleme, kolmele virtuaalmasinale. Sel etapil ei saa me tĂ€pselt prognoosida koormust, seetĂ”ttu hoidame mĂ”ned ressursid "varuks". Ja maksame liiga palju tĂŒhikĂ€igu eest.
Sellises olukorras saame sĂŒsteemi optimeerida hĂŒbriidlahenduse kaudu: koormuse tasakaalustaja taha jĂ€tame ĂŒhe virtuaalmasina ja seome selle Serverless Endpointiga funktsioonide jaoks. Kui koormus ĂŒletab piiri, kĂ€ivitab tasakaalustaja funktsioonide eksemplarid, mis vĂ”tavad osa pĂ€ringute töötlemisest.

Nii saab Serverlessi kasutada seal, kus tuleb harva, kuid intensiivselt töödelda suurt hulka pÀringuid. Sellisel juhul on mitme funktsiooni kÀivitamine 15 minutiks kasulikum kui pidevalt virtuaalmasina vÔi serveri hoidmine.
KĂ”ikide serverivabade arvutuste eeliste juures on enne rakenduse rakendamist kĂ”igepealt vajalik hinnata rakenduse loogikat ja mĂ”ista, milliseid ĂŒlesandeid suudab Serverless konkreetses olukorras lahendada.
Serverless ja Selectel
Selectelis oleme juba meie juhtpaneeli kaudu. NĂŒĂŒd ehitame oma FaaS-plaatvormi. Soovime, et arendajad saaksid oma ĂŒlesandeid lahendada Serverlessi abil mugava ja paindliku liidese kaudu.
Kui teil on ideid selle kohta, milline peaks olema ideaalne FaaS-plaatvorm ja kuidas soovite Serverlessi oma projektides kasutada, jagage neid kommentaarides. Arvestame teie soove platvormi arendamisel.
Â
Artiklis kasutatud materjalid:
Allikas: habr.com
