
Olen kindel, et pealkiri kutsus esile terve reaktsiooni - "noh, nĂŒĂŒd on see jĂ€lle alanud...". Kuid lubage mul haarata teie tĂ€helepanu 5-10 minutiks ja ma pĂŒĂŒan mitte petta teie ootusi.
Artikli struktuur nĂ€eb vĂ€lja jĂ€rgmine: vaadatakse stereotĂŒĂŒpset vĂ€idet ja paljastatakse selle stereotĂŒĂŒbi âloomuseâ taga. Loodetavasti vĂ”imaldab see teil vaadata andmevahetuse paradigma valikut oma projektides uue nurga alt.
Kuna on vajalik selgus selles, mis on RPC, soovitan arvesse vÔtta standardit . REST ei paku selgust. Ja ei peakski. KÔik, mida vajate RESTist teadmiseks, on, et see ei eristu .
RPC pÀringud on kiiremad ja tÔhusamad, kuna vÔimaldavad teha batch-pÀringuid.
Ehkki RPC vĂ”imaldab ĂŒhes pĂ€ringus korraga kutsuda mitut protseduuri. NĂ€iteks luua kasutaja, lisada talle avatar ja samas pĂ€ringus liituda mĂ”ne teema jĂ€lgimisega. Ainult ĂŒks pĂ€ring, kuid kui palju kasu!
TĂ”epoolest, kui teil on ainult ĂŒks backend sĂ”lm, tundub batch-pĂ€ringu puhul see kiirem. Sest kolm REST-pĂ€ringut vajavad ĂŒhelt sĂ”lmelt kolme korda rohkem ressursse ĂŒhenduste loomiseks.

Pange tÀhele, et esimeses pÀringus REST-iga tuleb tagastada kasutaja ID, et edasisi pÀringuid teha. See mÔjutab negatiivselt kogu tulemust.
Kuid selliseid infrastruktuure vÔib leida ainult siseringi lahendustes ja ettevÔtete tasemel. Viimase abinÔuna vÀikeses veebiprojektis. Kuid tÀielikke veebilahendusi, mis on nimetatud HighLoad, ei tohiks nii ehitada. Nende infrastruktuur peab vastama kÔrge kÀttesaadavuse ja koormuse kriteeriumidele. Ning pilt muutub.

Roheliselt on mĂ€rgitud infrastruktuuri aktiivsuse kanalid sama stsenaariumi puhul. Pange tĂ€hele, kuidas RPC nĂŒĂŒd kĂ€itub. PĂ€ring kasutab infrastruktuuri ainult ĂŒhe haru vĂ”rra koormaja ja backend vahel. Samal ajal, kui REST jĂ€tkuvalt kaotab esimeses pĂ€ringus, korrigeerib see puuduvaid ressursse, kasutades kogu infrastruktuuri.
Piisab, kui stsenaariumisse tuua mitte kaks, vaid nĂ€iteks viis vĂ”i kĂŒmme pĂ€ringut⊠ja kĂŒsimusele âkes nĂŒĂŒd vĂ”idab?â pole enam selget vastust.
Pakun vaadata probleemi veel laiemalt. Skeemil on nĂ€ha, kuidas infrastruktuuri kanaleid kasutatakse, kuid infrastruktuur ei piirdu kanalitega. KĂ”rge koormusega infrastruktuuri oluline komponent on vahemĂ€ed. Saatkem nĂŒĂŒd mĂ”ni kasutaja artefakt. Korduvalt. Ătleme 32 korda.

Vaadake, kui oluliselt on infrastruktuur RPC puhul âparanenudâ, et vastata kĂ”rge koormuse nĂ”udmistele. Asi on selles, et REST kasutab HTTP protokolli kĂ”iki vĂ”imeid, erinevalt RPC-st. Antud skeemil realizeerub see vĂ”ime pĂ€ringu meetodi kaudu - GET.
HTTP meetoditel on lisaks ka vahemÀlu strateegiad. Nendega tutvuda saab dokumentatsioonis . RPC kasutab POST pÀringuid, mida ei peeta idempotentseteks, see tÀhendab, et sama POST pÀringu korduv saatmine vÔib anda erinevaid tulemusi (nÀiteks iga kommentaari saatmise jÀrel ilmub uus koopia sellest kommentaarist) ().
Seega ei suuda RPC tĂ”husalt kasutada infrastruktuuri vahemĂ€lu. See toob kaasa vajaduse âimportidaâ tarkvaralisi vahemĂ€lusid. Skeemil on selles rollis esindatud Redis. Tarkvaraline vahemĂ€lu nĂ”uab omakorda arendajalt tĂ€iendavat koodikihti ja mĂ€rkimisvÀÀrseid muudatusi arhitektuuris.
Arvutame nĂŒĂŒd, kui palju pĂ€ringuid âtoodabâ REST ja RPC kĂ€sitletavas infrastruktuuris?
PĂ€ringud
Sisse tulevad
backendile
andmebaasile
tarkvahemÀllu (Redis)
KOKKU
REST
1/32*
1
1
0
3 / 35
RPC
32
32
1
31
96
[*] parima stsenaariumi korral (kui lokaalne vahemĂ€lu on kasutusel) 1 pĂ€ring (ainult ĂŒks!), halvimal juhul 32 sissetulevat pĂ€ringut.
Esimese skeemiga vĂ”rreldes on erinevus ĂŒĂŒratu. NĂŒĂŒd on selge, et REST vĂ”idab. Kuid pakun mitte peatuda saavutatud tulemuste juures. Arenenud infrastruktuur sisaldab ka CDN-i. Sageli lahendab see ka DDoS ja DoS rĂŒnnakute vastase vĂ”itluse kĂŒsimuse. Saame:

Siin muutub RPC olukord tĂ€iesti nutuseks. RPC lihtsalt ei suuda delegeerida CDN-i koormusega töötamist. JĂ€etakse lootma vaid rĂŒnnakute vastaseid sĂŒsteeme.
Kas on vĂ”imalik sellega lĂ”petada? Ja jĂ€lle, ei. HTTP meetoditel, nagu eelnevalt mainitud, on oma "maagia". Ja pole juhus, et GET meetodit kasutatakse Internetis ĂŒlimalt laialdaselt. Pange tĂ€hele, et see meetod suudab pöörduda osa sisu poole, suudab seada tingimusi, mida infrastruktuuri elemendid suudavad tĂ”lgendada juba enne teie koodi tĂ€itmist jne. KĂ”ik see vĂ”imaldab luua paindlikke, hallatavaid infrastruktuure, mis suudavad tĂ”eliselt suuri pĂ€ringute vooge töödelda. Ja RPC-s see meetod... ignoreeritakse.
Nii et miks on mĂŒĂŒt batch-pĂ€ringute (RPC) kiiretest olemisest nii pĂŒsiv? Isiklikult tundub mulle, et enamus projekte ei saavuta lihtsalt sellist arengutaset, kus REST suudab oma jĂ”udlust nĂ€idata. Veelgi enam, vĂ€ikestes projektides nĂ€itab see pigem oma nĂ”rkusi.
REST-i vĂ”i RPC valik ei ole ĂŒhe projekti inimosale isiklik valik. See valik peab vastama projekti nĂ”udmistele. Kui projekt suudab REST-ist vĂ€lja pigistada kĂ”ik, mida see tĂ”eliselt suudab, ja see on tĂ”eliselt vajalik, siis on REST suurepĂ€rane valik.
Kuid kui REST-i kĂ”igi eeliste saavutamiseks peate projekti palkama DevOps'e, et kiiresti infrastruktuuri skaleerida, administraatoreid infrastruktuuri haldamiseks, arhitekti kĂ”igi WEB teenuse kihtide projekteerimiseks... ja projekt mĂŒĂŒb samal ajal kolme pakki vĂ”id pĂ€evas... siis ma peatuksin RPC-l, kuna see protokoll on praktilisem. See ei nĂ”ua sĂŒgavaid teadmisi vahemĂ€ludest ja infrastruktuurist, vaid keskendub arendajatele lihtsatele ja arusaadavatele vajalike protseduuride kutsumisele. Ări on rahul.
RPC-pĂ€ringud on usaldusvÀÀrsemad, sest need suudavad teostada batch-pĂ€ringuid ĂŒhe tehingu raames.
See omadus on RPC puhul kahtlemata eelis, kuna andmebaasi hoiab kergemini kooskÔlvses seisundis. Kuid RESTi puhul on see keerulisem. PÀringud vÔivad jÀrk-jÀrgult saabuda erinevatele backend'il olevatele sÔlmedele.
See "puudus" REST-is on vastand ĂŒlaltoodud eelisele - vĂ”ime tĂ”husalt kasutada kĂ”iki infrastruktuuri ressursse. Kui infrastruktuur on valesti projekteeritud, ja veelgi enam, kui ka projekti arhitektuur ja eriti andmebaas on valesti projekteeritud, siis see on tĂ”eliselt suur valu.
Aga kas batch-pĂ€ringud on tĂ”eliselt nii usaldusvÀÀrsed kui tunduvad? Vaadakem juhtumit: loome kasutaja, rikastame tema profiili mingi kirjeldusega ja saadame talle SMS-i salajasega registreerimise lĂ”petamiseks. Ehk kolm kutsumist ĂŒhes batch-pĂ€ringus.

Vaadakem skeemi. Sellel on infrastruktuur, kus on kĂ”rge kĂ€ttesaadavuse elemendid. On kaks iseseisvat ĂŒhendust SMS-i gateway'ga. Kuid... mida me nĂ€eme? SMS-i saatmisel ilmneb tĂ”rge 503 - teenus on ajutiselt mitteaktiivne. Kuna SMS-i saatmine on pakitud batch-pĂ€ringusse, siis kogu pĂ€ring tuleb tagasi kerida. TEGUDETAKSE andmebaasis. Klient saab vea.
JÀrgmine katse on loterii. Kas pÀring jÔuab uuesti samale sÔlmele ja toob uuesti vea vÔi on Ônne ja see tÀidetakse. Peamine on see, et vÀhemalt korra on meie infrastruktuur juba asjatult vaeva nÀinud. Koormus oli, kuid kasu pole.
HĂ€sti, kujutame ette, et pingutasime (!) ja mĂ”tlesime vĂ€lja variandi, kus pĂ€ringut oleks vĂ”imalik osaliselt edukalt tĂ€ita. Ja ĂŒlejÀÀnud, proovime uuesti teatud aja pĂ€rast (Milline? Otsustab frontend?). Kuid loterii jĂ€i. SMS-i saatmise pĂ€ring ebaĂ”nnestub tĂ”enĂ€osusega 50/50 uuesti.
NÔustuge, et kliendi silmis ei tundu teenus nii usaldusvÀÀrne kui sooviksime... aga kuidas on REST-iga?

REST kasutab jĂ€lle HTTP "maagiat", kuid nĂŒĂŒd koos vastuse koodidega. Kui SMS-i gateway'l tekib tĂ”rge 503, edastab backend selle vea koormuse tasakaalustajale. Koormuse tasakaalustaja, saades selle vea ja katkestamata kliendiga ĂŒhendust, suunab pĂ€ringu teisele sĂ”lmele, mis tĂ€idab pĂ€ringu edukalt. Ehk klient saab ootuspĂ€rase tulemuse, ja infrastruktuur tĂ”estab end kĂ”rge kĂ€ttesaadavuse tasemel. Kasutaja on Ă”nnelik.
Ja see pole veel kÔik. Koormuse tasakaalustaja ei saanud lihtsalt vastuskoodi 503. Selle koodi vastuses on soovitatav varustada "Retry-After" pÀringuga. Pealkiri annab tasakaalustajale teada, et selle sÔlmega seda marsruuti ei maksaks mingil mÀÀral koormata. Ja jÀrgmised pÀringud SMS-i saatmiseks suunatakse kohe sÔlmele, kus pole mingeid probleeme SMS-i gateway'ga.
Nagu nĂ€eme, on JSON-RPC usaldusvÀÀrsuse ĂŒlehindamine. TĂ”epoolest, andmebaasi kooskĂ”lvsuse korraldamine on lihtsam. Kuid sel juhul on sĂŒsteemi usaldusvÀÀrsus tervikuna ohvriks.
VÀljund on suuresti sarnane eelnevale. Kui infrastruktuur on lihtne, siis JSON-RPC ilmselt on see pluss. Kui projekt annab vÔimaluse kÔrge kÀttesaadavuse ja kÔrge koormuse jaoks, siis REST tundub kindlasti Ôigema, kuigi keerulisema lahendusena.
REST-i sisenemisbarjÀÀr on madalam
Arvan, et eelnevalt toodud analĂŒĂŒs, mis lĂŒkkab ĂŒmber vĂ€ljakujunenud stereotĂŒĂŒpe RPC kohta, nĂ€itas selgelt, et REST-i sisenemisbarjÀÀr on kindlasti kĂ”rgem kui RPC-l. See on seotud vajadusega sĂŒgavalt mĂ”ista HTTP-d ning piisava teadlikkusega olemasolevatest infrastruktuuri elementidest, mida saab ja tuleks rakendada veebi projektides.
Aga miks arvavad paljud, et REST on lihtsam? Minu isiklik arvamus on see, et see nĂ€iliselt lihtsus tuleneb REST-i manifestidest. Ning REST ei ole protokoll, vaid kontseptsioon⊠REST-il ei ole standardit, on vaid mĂ”ned soovitused⊠REST ei ole keerulisem kui HTTP. NĂ€iliselt vaba ja anarhiline tĂ”mbab âvabu kunstnikkeâ.
Ilmselgelt ei ole REST keerulisem kui HTTP. Kuid HTTP on hĂ€sti lĂ€bimĂ”eldud protokoll, mis on tĂ”estanud oma vÀÀrtust aastakĂŒmnete jooksul. Kui puudub sĂŒgav arusaam HTTP-st, siis ei saa rÀÀkida ka REST-ist.
RPC-d aga saab. Piisab, kui vĂ”tta tema spetsifikatsioon. Kas see on vajalik? ? ĐлО ĐČŃĐ” жД Ń ĐžŃŃŃĐč REST? Đ Đ”ŃаŃŃ ĐČĐ°ĐŒ.
Loodan siiralt, et ma ei raisanud teie aega asjata.
Allikas: habr.com
