PHP Microservices: REST vs Socket árangursviðmið

Þegar um er að ræða smásjáþjónustu er algengasta og talsmenn aðferðin til að eiga samskipti við þjónustu RESTful API. Og REST er frábært val vegna þess að það:

  • Styður CRUD
  • Notaðu HTTP, sem gerir það auðvelt að tengjast frá hvaða tæki sem er
  • Auðvelt að nefna og skipuleggja auðlindir, sérstaklega flókin API

En jafnvel með þessum ávinningi, þá ÁHÆTTA það besti kosturinn? Ef þú ert einbeittur að frammistöðu sem aðalmarkmiði þínu, gæti HTTP REST API verið ein af minnstu ákjósanlegu lausnum. Í þessari kennslu ætlum við að keyra próf gegn tveimur gerðum af REST API í samanburði við forritun fals til að sjá hvaða lausn gefur þér besta árangur.

Byrjað er með fyrri námskeið

Áður en þú hoppar inn í þetta námskeið eru viðeigandi fyrri námskeið sem þú heimsækir:

  • Socket Forritun með tölvupósti sem dæmi
  • Að búa til afslappaðan CRUD API

Þessar stuttu námskeið munu hjálpa þér að skilja falsforritun og RESTFUL forritaskil sem fjallað er um hér að neðan.

Keyra kóðann

Kóðinn fyrir þessa námskeið og önnur dæmi er að finna á: https://github.com/ProdigyView-Toolkit/Microservices-Examples-PHP

Notaðu möppuna sem heitir socket_vs_httpand og fylgdu README.

Setja upp RESTFUL CRUD API með vegvísun

Í fyrsta prófmálinu okkar ætlum við að hringja í API eins og það væri á bak við leið. Til að skýra vegvísun - vegvísunin sem fjallað er um hér á sér stað við umsóknarlagið og beinir úrræðum byggð á url slóðinni. Til dæmis, api / video / upload mun fara í aðgerðir í þjónustu til að hlaða upp myndbandi og / posts / 1023 getur farið í aðra þjónustu til að finna færslu með auðkenni.

Öll vinsælustu rammar nútímans hafa leiðargetu í tækjum. Þetta felur í sér Lumen, Slim, Laravel, DJango, Kolbu o.s.frv. Síðustu tveir eru Python vegna þess að hugtakið venja er tungumálanotkun.

Núna er leiðarferlið oft mjög flókin og dýr aðgerð. Að lágmarki þarf oft reglulega að tjá vefslóð og beina aðgerðinni. Sumir vegvísanir eru mjög öflugir og afar flóknir eins og Laravels Routing Class.

Í prófinu okkar verður bekkurinn okkar sem ætlar að skilgreina leiðina http_server / index.php og mun aðeins skila svörum svona:

Setja upp RESTFUL án leiðar

Í næsta kóðaprófi okkar ætlum við að slökkva á vegvísun alveg. Í staðinn ætlum við að hafa beint HTTP svar í http_server / get.php. Nokkuð og einfalt próf.

Próf Socket Server

Í síðasta prófinu okkar ætlum við að hafa Socket Server. Nú vil ég að þú takir smá stund til að meta að falsprófið er að taka auka skref sem HTTP prófin tvö eru ekki - afkóðunar- og dulkóðunargögn þess!

Dulkóðun tekur ekki aðeins tíma til að keyra heldur eykur einnig lengd gagnanna sem send eru. Enn eitt einfalt próf sem sendir upplýsingar til baka eftir að þær hafa borist:

Viðskiptavinurinn til að senda prófið

Viðskiptavinurinn til að senda prófið samanstendur af tveimur CURL beiðnum sem sendar eru og 1 Socket próf. Gögnin sem send eru til allra endapunkta eru þau sömu, nema að falsinn þarf að dulkóða gögnin fyrst. Ein CURL beiðnin er GET og hin er POST. Kóði hér að neðan:

Og við skulum keyra prófið!

Niðurstöður prófs

Próf 1: 100 beiðnir

HTTP leiðartími: 0.39216995239258

HTTP GET tími (engin leið): 0.33528399467468

Prófunartími fals: 0,082527875900269

Próf 2: 500 beiðnir

HTTP leiðartími: 1.8593518733978

HTTP GET tími (Engin leið): 1.5577518939972

Prófunartími fals: 0.37446594238281

Próf 3: 1000 beiðnir

HTTP leiðatími: 4.1550130844116

HTTP GET tími (Engin leið): 3.1718351840973

Prófunartími fals: 0.72313618659973

Mikilvæg athugasemd: Sama próf var keyrt með GET beiðni um leið leiðar til að gera það sambærilegra við hitt GET prófið. Niðurstöðurnar voru þær sömu.

Greining á prófunum

Þegar 100 beiðnir eru um er HTTP án leiðsagnar 15% hraðari en með vegvísun. Og með því að nota innstungu var hraðinn 130% hraðari. Þegar álagið jókst í 1000 beiðnir var frammistöðu bilið milli HTTP með vegvísun samanborið við enga vegvísun 26% og miðað við innstunguna var mismunurinn 140%. Það er alveg andstæða!

Þetta atriði skal tekið fram aftur: Innstungurnar dulkóða og afkóða gögnin og eru enn betri en HTTP!

Í vörn HTTP eru HTTP hausar gríðarstórir! Hugsaðu um allar upplýsingar sem fara í haus:

  • Gerð efnis
  • Heiðursett
  • Leyfa aðgangsstýring- *
  • Svarkóði
  • X-framsent til
  • Fjarlæg heimilisfang
  • Beiðni um aðferð
  • etc etc etc

Og listinn getur haldið áfram með mörgum hlutum sem HTTP hausar innihalda. Þessar upplýsingar eru mikið af gögnum til að vinna úr, ekki aðeins til að senda heldur fyrir móttöku netþjón til að vinna úr. Socket forritun er beinari þegar þú tengist endapunktinum og sendir bara gögnin.

Takeaways fyrir smásöluþjónustu

Til að keyra ofangreint dæmi um heimamann þinn geturðu heimsótt endurhverfið hér.

Þegar þú smíðar örþjónusturnar þínar er REST frábær nálgun til að byggja upp öröryggi sem auðvelt er að nálgast, skipuleggja og skilja - sérstaklega fyrir flókin API. En frammistöðu skynsamleg REST er mjög hæg miðað við innstungur. Sparnaður náð fyrir REST er að fyrir suma viðskiptavini eins og Javascript geta ósamstilltur samskipti hjálpað til við afkomumálin.

Þegar smíðaðar smásöluþjónustur eru gerðar skaltu íhuga skiptin fyrir hraða til að viðhalda. Hversu margar beiðnir eru að vinna úr örþjónustunni og hvernig myndi breyting koma fyrirtækinu til góða? Er til lausn sem getur móttekið HTTP beiðnir hraðar en PHP en sendi það síðan fljótt til PHP þjónustu yfir fals? Þarf örþjónustan virkilega REST API?

Ef þörf er á HTTP og þú vilt bæta hraðann skaltu íhuga:

  • Fjarlægir uppblásinn leið frá útfærslunni þinni í berar lágmarkslausnir.
  • Í ljósi þess að það er lítil örþjónusta, skrifaðu sérsniðna leið án raunverulegs virkni en skilyrt fullyrðingar (þ.e. ef ($ beiðni == 'GET') {// Gera aðgerð} annars {// Gera aðra aðgerð}.
  • Draga úr stærð upplýsinganna sem sendar eru, þ.e. farga hausreitum sem eru ekki nauðsynlegir.

Fleiri námskeið

Ef þú hefur áhuga á að læra meira um Microservices með PHP, lestu nokkrar aðrar leiðbeiningar okkar:

  • Að nota biðkerfi með RabbitMQ
  • Búðu til afslappaðan CRUD API
  • Skipuleggja aðgang að fjölmörgum þjónustu
  • Sannvottun og heimild
  • Virk forritun og einingapróf