
Ma olen kindel, et pealkiri tekitas terve reaktsiooni â "oh mitte jĂ€lle...". Kuid lubage mul haarata teie tĂ€helepanu 5-10 minutiks ning ma pĂŒĂŒan mitte petta teie ootusi.
Artikli struktuur on jĂ€rgmine: tuuakse vĂ€lja stereotĂŒĂŒpne vĂ€ide ja paljastatakse selle stereotĂŒĂŒbi tekkimise "lood". Loodan, et see vĂ”imaldab vaadata oma projektide andmevahetusparadigmat uue nurga alt.
Selleks, et oleks selge, mis on RPC, soovitan vaadata standardit . RESTi puhul ei ole selgust. Ja see ei pea olema. KÔik, mida RESTi kohta teada on, on see, et see on eristamatu .
RPC pÀringud on kiiremad ja tÔhusamad, kuna nad vÔimaldavad teha batch-pÀringuid.
KĂŒsimus on selles, et RPC-s saab ĂŒhes pĂ€ringus teha mitme protseduuri kutse. NĂ€iteks luua kasutaja, lisada talle avatar ja samas pĂ€ringus tellida ta mĂ”nele teemale. Ainult ĂŒks pĂ€ring, kuid kui palju kasu!
TĂ”epoolest, kui teil on ainult ĂŒks backend'i sĂ”lm, vĂ”ib see tunduda kiirem batch-pĂ€ringu korral. Kuna kolm REST pĂ€ringut nĂ”uavad ĂŒhest sĂ”lmest ĂŒhenduse loomisel kolm korda rohkem ressurssi.

Pange tĂ€hele, et esimene pĂ€ring RESTi puhul peab tagastama kasutaja identifikaatori jĂ€rgmiste pĂ€ringute tĂ€itmiseks. See mĂ”jutab ka ĂŒleĂŒldiselt negatiivselt tulemust.
Kuid selliseid infrastruktuure vĂ”ib leida vaid, juhul, kui need on in-house lahendustes ja ettevĂ”tetes. ĂĂ€rmuslikel juhtudel vĂ€ikestes veebiprojektides. Kuid tĂ€isvÀÀrtuslikke veebilahendusi, veelgi enam nimetatuna HighLoad, ei tohiks nii ehitada. Nende infrastruktuur peab vastama kĂ”rge kĂ€ttesaadavuse ja koormusnĂ”uetele. Siis muutub olukord.

Roheline nĂ€itab infrastruktuuri aktiivsuskanaleid sama stsenaariumi puhul. Pange tĂ€hele, kuidas RPC nĂŒĂŒd kĂ€itub. PĂ€ring kasutab infrastruktuuri ainult ĂŒhe liini ulatuses tasakaalustajast backendini. Samas, kui REST ikka veel kaotab esimeses pĂ€ringus, kuid jookseb mööda, kasutades kogu infrastruktuuri.
Piisab, kui stsenaariumi tuuakse mitte kaks rikastamis pĂ€ringut, vaid nĂ€iteks viis vĂ”i kĂŒmme⊠ja vastus kĂŒsimusele "kes nĂŒĂŒd vĂ”idab?" muutub ebaselgeks.
Pakun vaatama probleemi veelgi laiemalt. Skeemilt on nĂ€ha, kuidas infrastruktuuri kanaleid kasutatakse, kuid infrastruktuur ei piirdu kanalitega. Oluline osa kĂ”rgekoormuslikust infrastruktuurist on vahemĂ€lud. Vaatame nĂŒĂŒd, kuidas kasutaja artefaktide genereerimine vĂ€lja nĂ€eb. Korrake seda mitu korda. Ătleme 32 korda.

Vaadake, kuidas on RPC infrastruktuur selgelt "paranenud", et tulla toime kĂ”rge koormuse nĂ”udmistega. Asi on selles, et REST kasutab kogu HTTP protokolli vĂ”imsust, erinevalt RPC-st. Antud skeemil on see vĂ”ime realiseeritud pĂ€ringu meetodi kaudu â GET.
HTTP meetoditel on lisaks muule ka vahemÀlustrateegiad. Nendega saab tutvuda dokumentatsioonis aadressil . RPCs kasutatakse POST pÀringuid, mis ei ole idempotentsed, st korduv samade POST pÀringute tegemine vÔib anda erinevaid tulemusi (nÀiteks iga kord, kui kommentaari saadetakse, tekib uus koopia sellest kommentaarist) ().
Seega ei suuda RPC tÔhusalt kasutada infrastruktuuri vahemÀlusid. See tÀhendab, et tuleb "tuua sisse" tarkvara vahemÀlud. Skeemil esindab neid Redis. Tarkvara vahemÀlu, omakorda, nÔuab arendajalt tÀiendavat koodikihti ja olulisi muudatusi arhitektuuris.
Arvutame nĂŒĂŒd, kui palju pĂ€ringuid on REST ja RPC eelkĂ”ige infrastruktuuris genereerinud?
PĂ€ringud
Sissetulevad
backendile
andmebaasile
tarkvahemÀlule (Redis)
KOKKU
REST
1/32*
1
1
0
3 / 35
RPC
32
32
1
31
96
[*] parimal juhul (kui kohalikku vahemĂ€lus kasutatakse) 1 pĂ€ring (ainult ĂŒks!), halvemal juhul 32 sisenevat pĂ€ringut.
Esimese skeemiga vĂ”rreldes on erinevus silmatorkav. NĂŒĂŒd on selge, et REST-il on eelised. Kuid ma pakun, et ei tasu sellele peatuda. Arenenud infrastruktuur hĂ”lmab CDN-i. Sageli lahendab see ka DDoS ja DoS rĂŒnnakute vastased probleemid. Saame:

Siin muutuvad asjad RPC jaoks tĂ”eliselt murettekitavaks. RPC ei suuda lihtsalt CDN koormuse haldamist delegeerida. JÀÀb loota vaid rĂŒnnakute vastu suunatud sĂŒsteemidele.
Kas sellel saab lĂ”ppeda? Ja jĂ€lle, ei. HTTP meetodid, nagu eelnevalt mainitud, omavad oma âmaagiatâ. Ja pole juhus, et GET meetod on Internetis kĂ”ige enam kasutatav. Pange tĂ€hele, et see meetod suudab pöörduda sisu osade poole, suudab seada tingimusi, mida infrastruktuurielemendid saavad tĂ”lgendada veel enne, kui kontroll teie koodi ĂŒle antakse jne. KĂ”ik see vĂ”imaldab luua painduvaid, hallatavaid infrastruktuure, mis suudavad tĂ”eliselt suuri pĂ€ringute vooge seedida. Ja RPC puhul jĂ€etakse see meetod... tĂ€helepanuta.
Nii et miks on mĂŒĂŒt, et batch-pĂ€ringud (RPC) on kiiremad, nii pĂŒha? Isiklikult tundub mulle, et enamik projekte ei jĂ”ua lihtsalt sellisele arengutasemele, et REST suudaks oma tĂ”eliselt head kĂŒlge nĂ€idata. Veelgi enam, vĂ€ikestes projektides nĂ€itab see pigem oma nĂ”rkusi.
REST vĂ”i RPC valik ei ole ĂŒhe inimese isiklik valik projektis. See valik peab vastama projekti nĂ”udmistele. Kui projekt suudab RESTist kĂ”ik vĂ€lja pressida, mida ta tĂ”eliselt suudab, ja see on tĂ”eliselt vajalik, siis on REST suurepĂ€rane valik.
Aga kui RESTi kĂ”igi eeliste saamiseks tuleb palgata projektis devOps'e infrastruktuuri operatiivseks skaleerimiseks, administraatoreid infrastruktuuri haldamiseks, arhitekte kĂ”igi WEB teenuse kihtide projekteerimiseks... ja projekt toob samal ajal mĂŒĂŒki kolm pakki margariini pĂ€evas... jÀÀksin RPC juurde, kuna see protokoll on utilitaarselt sĂ”bralikum. See ei nĂ”ua sĂŒgavat arusaama vahemĂ€cache ja infrastruktuuri tööst, vaid suunab arendajat lihtsatele ja arusaadavatele vajalike protseduuride kutsetele. Ări on rahul.
RPC pĂ€ringud on usaldusvÀÀrsemad, kuna nad suudavad lĂ€bi viia batch-pĂ€ringud ĂŒhe tehingu raames.
See RPC omadus on kahtlemata pluss, kuna andmebaasi on lihtsam hoida jÀrjepidevas seisundis. RESTiga on see keerulisem. PÀringud vÔivad jÔuda mitteseotud jÀrjekorras erinevatele backend node'idele.
See RESTi âpuudusâ on vastand eelpool mainitud eelistele â vĂ”ime tĂ”husalt kasutada kogu infrastruktuuri ressursse. Kui infrastruktuur on halvasti projekteeritud, ja veelgi enam, kui projekti arhitektuur ja andmebaas on halvad, on see tĂ”eliselt suur nuhtlus.
Aga kas batch-pĂ€ringud on tĂ”eliselt nii usaldusvÀÀrsed nagu nad paistavad? Uurime nĂ€idet: loome kasutaja, rikastame tema profiili millegi kirjeldusega ja saadame talle SMS-i registreerimise lĂ”petamiseks vajaliku saladusega. See tĂ€hendab, et teeme kolm kutset ĂŒhe batch-pĂ€ringu raames.

Uurime skeemi. See nĂ€itab infrastruktuuri, kus on kĂ”rge kĂ€ttesaadavuse elemendid. Seal on kaks sĂ”ltumatut sidekanalit SMS-gatewayâidega. Kuid... mida me nĂ€eme? SMS-i saatmisel ilmneb viga 503 - teenus on ajutiselt saadaval. Kuna SMS-i saatmine on pakitud batch-pĂ€ringusse, peab kogu pĂ€ring tagastama. Tegevused andmebaasis tĂŒhistatakse. Klient saab vea.
jÀrgmine katse - loterii. Kas pÀring satub taas sama sÔlme ja tagastab jÀlle vea, vÔi lÀheb meil hÀsti ja see tÀidetakse. Kuid peamine on, et meie infrastruktuur on juba vÀhemalt korra tööle asunud asjatult. Koormus oli, kuid kasu pole.
Oleme nĂ”us, et kujutame ette, et pingutasime (!) ja mĂ”tlesime vĂ€lja variandi, kuidas pĂ€ringut vĂ”iks osaliselt edukalt tĂ€ita. Ja ĂŒlejÀÀnu pĂŒĂŒame uuesti mĂ”ne aja pĂ€rast tĂ€ita (Millisest ajast? Otsustab front?). Kuid loterii jĂ€i endiseks. SMS-i saatmise pĂ€ring ebaĂ”nnestub tĂ”enĂ€osusega 50/50 uuesti.
NÔus, kliendi seisukohalt ei tundu teenus nii usaldusvÀÀrne kui tahaksime ... ent kuidas on REST-iga?

REST kasutab jĂ€lle HTTP "maagiat", kuid nĂŒĂŒd koos vastuskoodidega. Kui SMS-gateway'l ilmneb viga 503, edastab backend selle vea laadijale. Laadija, saades selle vea, ei katkesta ĂŒhendust kliendiga, vaid suunab pĂ€ringu teise sĂ”lme, mis tĂ€idab pĂ€ringu edukalt. Seega saab klient oodatud tulemuse ja infrastruktuur kinnitab oma kĂ”rget pealkirja "kĂ”rge kĂ€ttesaadavus". Kasutaja on rahul.
Ja see pole veel kÔik. Laadija ei saanud lihtsalt vastuskoodi 503. Selle koodi puhul on soovitatav vastusele lisada pealkiri "Retry-After". Pealkiri annab teada laadijale, et ei tasu seda sÔlme selle marsruudi kaudu teatud aja jooksul hÀirida. JÀrgmised pÀringud SMS-i saatmiseks suunatakse kohe sÔlmele, kus ei esine probleeme SMS-gateway'ga.
Kuidas me nĂ€eme, on JSON-RPC usaldusvÀÀrsus ĂŒle hinnatud. TĂ”epoolest, andmebaasi konsistentsi korraldamine on lihtsam. Kuid nende juhtumite ohvriks langeb sĂŒsteemi usaldusvÀÀrsus tervikuna.
VÀljund on suuresti sarnane eelnevale. Kui infrastruktuur on lihtne, on JSON-RPC ilmselgelt selle pluss. Kui projekt nÔuab kÔrget saadavust ja suurt koormust, nÀib REST olema Ôigem, ehkki ka keerulisem lahendus.
REST-i sisenemislÀvi on madalam.
Lugesin, et ĂŒlaltoodud analĂŒĂŒs, mis lĂŒkkab ĂŒmber kehtivad stereotĂŒĂŒbid RPC kohta, nĂ€itab ilmekalt, et sisenemislĂ€vi REST-i on kindlasti kĂ”rgem kui RPC-l. See tuleneb vajadusest sĂŒgavalt mĂ”ista HTTP toimimist ning omada piisavalt teadmisi olemasolevatest infrastruktuuri elementidest, mida saab ja tuleb rakendada veebiprojektides.
Kuid miks paljud arvavad, et REST on lihtsam? Isiklikult arvan, et see nÀiliselt lihtsus tuleneb REST-i manifestidest. Nimelt, REST ei ole protokoll, vaid kontseptsioon... REST-il ei ole standardit, on vaid mÔned soovitused... REST ei ole keerulisem kui HTTP. NÀiline vabadus ja anarhia meelitavad 'vabu kunstnikke'.
Ilmselgelt ei ole REST keerulisem kui HTTP. Kuid HTTP ise on hĂ€sti lĂ€bi mĂ”eldud protokoll, mis on juba aastakĂŒmneid tĂ”estanud oma tĂ”husust. Kui ei ole sĂŒgavat arusaamist HTTP-st, siis ei saa hinnata ka REST-i.
Aga RPC kohta saab kĂŒll. Piisab, kui vĂ”tta tema spetsifikatsioon. Kas teil on siis vaja ? ĐлО ĐČŃĐ” жД Ń ĐžŃŃŃĐč REST? Đ Đ”ŃаŃŃ ĐČĐ°ĐŒ.
Loodan siiralt, et ma ei raisanud teie aega asjatult.
Allikas: habr.com
