JSON-RPC? Ta en smart REST

JSON-RPC? Ta en smart REST

Jeg er sikker pĂ„ at overskriften har fĂ„tt en god reaksjon – "nĂ„ begynner det igjen..." Men la meg ta over oppmerksomheten din i 5-10 minutter, og jeg skal prĂžve Ă„ ikke skuffe forventningene.

Artikkelen vil ha fÞlgende struktur: et stereotypisk pÄstand blir tatt opp, og "natur" av oppkomsten av dette stereotypt blir utdypet. Jeg hÄper dette vil gi et nytt perspektiv pÄ valget av datadeling paradigmer i prosjektene dine.

For Ă„ ha klarhet i hva som menes med RPC, foreslĂ„r jeg at vi ser pĂ„ standarden JSON-RPC 2.0. Det er ingen klarhet med REST. Og det skal ikke vĂŠre det. Alt du trenger Ă„ vite om REST – det er ikke forskjellig fra HTTP.

RPC forespĂžrslene er raskere og mer effektive, fordi de tillater batch-forespĂžrsel.

Det handler om at i RPC kan du i én forespÞrsel kalle flere prosedyrer samtidig. For eksempel opprette en bruker, legge til et avatarbildet for dem, og i samme forespÞrsel abonnere dem pÄ noen emner. Bare én forespÞrsel, men sÄ mye nytte!

Faktisk, hvis du bare har én backend-node, vil det virke raskere med en batch-forespÞrsel. Fordi tre REST-forespÞrsel vil kreve tre ganger mer ressurser fra én node for Ä opprette tilkoblinger.

JSON-RPC? Ta en smart REST

Legg merke til at den fÞrste forespÞrselen i tilfelle med REST mÄ returnere brukerens identifikator for Ä utfÞre de pÄfÞlgende forespÞrslene. Dette pÄvirker ogsÄ den samlede ytelsen negativt.

Men slike infrastrukturer finner man bare i in-house lÞsninger og Enterprise. I verste fall i mindre WEB prosjekter. Men komplett WEB-lÞsninger, som ogsÄ kalles HighLoad, bÞr ikke bygges pÄ den mÄten. Deres infrastruktur mÄ mÞte kriteriene for hÞy tilgjengelighet og belastning. Og bildet endres.

JSON-RPC? Ta en smart REST

GrÞnne markerer aktivt kanaler av infrastrukturen med samme scenario. Legg merke til hvordan RPC nÄ oppfÞrer seg. ForespÞrselen bruker infrastrukturen bare gjennom én arm fra lastbalansereren til backend. Mens REST fortsatt taper i den fÞrste forespÞrselen, men tar igjen det tapte ved Ä bruke hele infrastrukturen.

Bare introduksjon av ikke to forespÞrsel for berikelse, men si fem eller ti
 og svaret pÄ spÞrsmÄlet "hvem vinner nÄ?" blir ikke Äpenbart.

La meg se nÊrmere pÄ problemet. Diagrammet viser hvordan infrastrukturskanaler brukes, men infrastrukturen er ikke begrenset til kanalene. En viktig del av en hÞyytelses infrastruktur er hurtiglagring. La oss nÄ lage en brukerartefakt. Flere ganger. Si 32 ganger.

JSON-RPC? Ta en smart REST

Se hvordan infrastrukturen for RPC tydelig har "ekspandert" for Ă„ mĂžte kravene til hĂžy belastning. Grunnen er at REST utnytter hele kraften til HTTP-protokollen, i motsetning til RPC. I diagrammet er denne kraften realisert gjennom forespĂžrselmetoden — GET.

HTTP-metoder har, blant annet, cachingstrategier. Du kan bli kjent med dem i dokumentasjonen pÄ HTTP. RPC bruker POST-forespÞrsel, som ikke anses som idempotente, det vil si at gjentatte sendinger av de samme POST-forespÞrslene kan gi forskjellige resultater (for eksempel vil hver gang en kommentar sendes, dukke opp en ny kopi av den kommentaren) (kilde).

FÞlgende betyr at RPC ikke kan bruke infrastrukturelle cacher effektivt. Dette fÞrer til at det mÄ "bringes inn" programvare-cacher. I diagrammet er Redis representert i denne rollen. Programvare-cachen krever pÄ sin side et ekstra lag med kode fra utvikleren og betydelige endringer i arkitekturen.

La oss nÄ telle hvor mange forespÞrslene REST og RPC genererte i den aktuelle infrastrukturen?

ForespĂžrsel
InngÄende
til backend
til databasen
til programvare-cachen (Redis)
TOTAL

REST
1/32*
1
1
0
3 / 35

RPC
32
32
1
31
96

[*] i beste fall (hvis lokal cache brukes) 1 forespÞrsel (én!), i verste fall 32 inngÄende forespÞrsel.

Sammenlignet med det fÞrste diagrammet er forskjellen slÄende. NÄ blir det Äpenbart hvordan REST vinner. Men jeg foreslÄr at vi ikke stopper her. En avansert infrastruktur inkluderer CDN. Ofte lÞser den ogsÄ problemet med Ä motvirke DDoS- og DoS-angrep. La oss se:

JSON-RPC? Ta en smart REST

Her blir situasjonen for RPC helt hÄplÞs. RPC kan rett og slett ikke delegere belastningshÄndteringen til CDN. Man mÄ bare hÄpe pÄ systemer for Ä motvirke angrep.

Kan vi avslutte med dette? Og igjen, nei. HTTP-metodene har som nevnt sin «magisk». Og ikke uten grunn er GET-metoden den mest brukte pÄ Internett. Legg merke til at denne metoden kan fÄ tilgang til deler av innhold, kan sette betingelser som kan tolkes av infrastrukturen fÞr kontrollen overleveres til koden din, osv. Alt dette gjÞr det mulig Ä lage fleksible, administrerte infrastrukturer som kan hÄndtere ganske store strÞmmer av forespÞrsel. Og i RPC blir denne metoden... ignorert.

SÄ hvorfor er myten om at batch-forespÞrsel (RPC) er raskere sÄ vedvarende? Personlig tror jeg at de fleste prosjekter bare ikke nÄr et utviklingsnivÄ der REST kan vise sin styrke. Videre, i smÄ prosjekter, viser det heller sin svakhet.

Valget mellom REST eller RPC er ikke en viljesbeslutning fra en enkeltperson i prosjektet. Dette valget bÞr imÞtekomme prosjektets krav. Hvis prosjektet er i stand til Ä utnytte alt REST har Ä tilby, og det virkelig er nÞdvendig, sÄ vil REST vÊre et utmerket valg.

Men hvis det pÄkreves Ä ansette devops for Ä kunne skalere infrastrukturen effektivt, administratorer for Ä hÄndtere infrastrukturen, arkitekter for Ä designe alle lagene av WEB-tjenesten... mens prosjektet samtidig selger tre pakker margarin om dagen... ville jeg ha stoppet ved RPC, fordi denne protokollen er mer pragmatisk. Den krever ingen dype kunnskaper om cache-arbeid og infrastruktur, og lar utvikleren fokusere pÄ enkle og forstÄelige anrop til de prosedyrene han trenger. Virksomheten vil vÊre tilfreds.

RPC-forespÞrsler er mer pÄlitelige fordi de kan utfÞre batch-forespÞrsel innenfor en enkelt transaksjon.

Denne egenskapen ved RPC er en ubestridelig fordel, da det er lett Ă„ holde databasen i en konsistent tilstand. Men med REST blir dette mer komplisert. ForespĂžrslene kan komme usammenhengende til forskjellige backend-noder.

Denne «ulempen» ved REST er den motsatte siden av dens fordel som beskrevet ovenfor - evnen til effektivt Ä bruke alle ressursene i infrastrukturen. Hvis infrastrukturen er dÄrlig designet, og spesielt hvis prosjektet og databasen er dÄrlig arkitekturerte, vil dette ofte vÊre en stor utfordring.

Men er batch-forespÞrslene sÄ pÄlitelige som de ser ut til? La oss se pÄ et tilfelle: vi oppretter en bruker, beriker profilen med en beskrivelse og sender ham/SMS med en hemmelighet for Ä fullfÞre registreringen. Det vil si tre kall i én batch-forespÞrsel.

JSON-RPC? Ta en smart REST

La oss se pĂ„ skjemaet. Det viser infrastrukturen med elementer for hĂžy tilgjengelighet. Det er to uavhengige kommunikasjonslinjer med SMS gatewayer. Men
 hva ser vi? NĂ„r vi sender SMS oppstĂ„r det en 503-feil — tjenesten er midlertidig utilgjengelig. Siden sendingen av SMS er pakket inn i en batch-forespĂžrsel, mĂ„ hele forespĂžrselen rulles tilbake. Handlingene i databasen blir annullert. Klienten fĂ„r en feil.

Neste forsÞk er et lotteri. Enten vil forespÞrselen igjen havne pÄ den samme noden og returnere feilen, eller sÄ kan det vÊre flaks, og den vil bli gjennomfÞrt. Men viktigst av alt, minst én gang har infrastrukturen vÄr allerede jobbet forgjeves. Det var belastning, men ingen gevinst.

Bra, la oss forestille oss at vi har anstrengt oss (!) og tenkt pÄ et alternativ der forespÞrselen kan bli vellykket utfÞrt delvis. Og resten vil vi igjen prÞve Ä utfÞre etter en viss tids periode (Hvor lenge? Det bestemmer fronten?). Men lotteriet forblir. ForespÞrselen om Ä sende SMS vil med 50/50 sannsynlighet igjen mislykkes.

Enig, fra klientens side ser ikke tjenesten sÄ pÄlitelig ut som man skulle Þnsket... hvordan er det med REST?

JSON-RPC? Ta en smart REST

REST bruker igjen "magien" av HTTP, men nÄ med svarkoder. Ved feil 503 pÄ SMS-gatewayen, oversetter bakenden denne feilen til lastbalansereren. Lastbalansereren mottar denne feilen, og uten Ä bryte forbindelsen til klienten sender forespÞrselen til en annen node som vellykket behandler forespÞrselen. Klienten fÄr med andre ord det forventede resultatet, og infrastrukturen bekrefter sin hÞye status som "hÞyt tilgjengelig". Brukeren er fornÞyd.

Og igjen er ikke alt. Lastbalansereren mottok ikke bare svarkode 503. Denne koden skal ifĂžlge standarden gjerne suppleres med headeren "Retry-After". Headeren gir lastbalansereren beskjed om at det ikke er lurt Ă„ forstyrre denne noden gjennom denne ruten i lĂžpet av den angitte tiden. Og neste forespĂžrsel om Ă„ sende SMS vil bli sendt direkte til noden som ikke har problemer med SMS-gatewayen.

Som vi ser, er pÄliteligheten til JSON-RPC overvurdert. Faktisk er det lettere Ä organisere konsistens i databasen. Men i sÄ fall vil pÄliteligheten til systemet som helhet bli offer.

Utgang er i stor grad lik den forrige. NÄr infrastrukturen er enkel, er tydeligheten av JSON-RPC utvilsomt et pluss. Hvis prosjektet krever hÞy tilgjengelighet med hÞy belastning, ser REST ut til Ä vÊre et mer korrekt, om enn mer komplisert, valg.

Inngangsbarrieren for REST er lavere

Jeg mener at analysen ovenfor, som avkrefter etablerte stereotyper om RPC, tydelig viser at inngangsbarrieren for REST uten tvil er hÞyere enn for RPC. Dette skyldes behovet for en dyp forstÄelse av hvordan HTTP fungerer, samt behovet for tilstrekkelig kunnskap om eksisterende infrastrukturelementer som kan og bÞr brukes i WEB-prosjekter.

SĂ„ hvorfor tror mange at REST vil vĂŠre enklere? Personlig mener jeg at denne tilsynelatende enkelheten stammer fra selve manifestene til REST. Det vil si, REST er ikke et protokoll, men et konsept
 REST har ingen standard, det finnes enkelte anbefalinger
 REST er ikke mer komplisert enn HTTP. Den tilsynelatende friheten og anarkiet tiltrekker "frie kunstnere".

Utvilsomt er ikke REST mer komplisert enn HTTP. Men HTTP i seg selv er et godt gjennomtenkt protokoll som har bevist sin holdbarhet gjennom tiÄr. Hvis det ikke finnes en dyp forstÄelse av HTTP selv, kan man ikke dÞmme om REST.

Men for RPC — det kan man. Det er tilstrekkelig Ă„ ta spesifikasjonen hans. SĂ„ trenger du dum JSON-RPC? ИлО ĐČсД жД хотрыĐč REST? Đ Đ”ŃˆĐ°Ń‚ŃŒ ĐČĐ°ĐŒ.

Jeg hÄper virkelig at jeg ikke har kastet bort tiden din.

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster