PHP Microservices: REST vs. Socket Performance Benchmarks

Pokud jde o mikroservisy, nejčastější a obhajovanou metodou pro komunikaci se službou je RESTful API. A REST je skvělá volba, protože:

  • Podporuje CRUD
  • Použijte HTTP, což usnadňuje připojení z jakéhokoli zařízení
  • Snadno pojmenovávat a organizovat zdroje, zejména složitá API

Ale i s těmi výhodami, je RESTFUL nejlepší volba? Pokud se zaměřujete na výkon jako svůj hlavní cíl, může být HTTP REST API jedním z nejméně optimálních řešení. V tomto tutoriálu budeme ve srovnání s programováním soketů testovat dvě formy REST API, abychom zjistili, které řešení vám poskytne nejlepší výkon.

Počínaje předešlými tutoriály

Před skokem do tohoto tutoriálu jsou relevantní předchozí návody k návštěvě:

  • Příkladem je programování soketů s e-maily
  • Vytvoření klidného rozhraní CRUD API

Tyto krátké návody vám pomohou porozumět programování soketů a implementaci RESTFUL API popsané níže.

Spusťte kód

Kód pro tento tutoriál a další příklady je k dispozici na adrese: https://github.com/ProdigyView-Toolkit/Microservices-Examples-PHP

Použijte složku s názvem socket_vs_httpand postupujte podle README.

Nastavení API RESTFUL CRUD pomocí směrování

V našem prvním testovacím případě zavoláme API, jako by to bylo za routerem. Pro vyjasnění směrování - zde diskutované směrování probíhá na aplikační vrstvě a směřuje zdroje na základě cesty URL. Například api / video / upload půjde na funkce ve službě pro nahrávání videa a / posts / 1023 může jít do jiné služby pro nalezení příspěvku pomocí id.

Všechny dnešní nejoblíbenější Frameworks mají ve své sadě nástrojů směrovací funkce. Patří sem Lumen, Slim, Laravel, DJango, Flask atd. Poslední dva jsou Python, protože koncepce směrování je jazyková agnostika.

Nyní je proces směrování často velmi složitý a nákladný provoz. Minimálně často rozebírá url a řídí akci pravidelnými výrazy. Některé směrování je velmi silné a extrémně složité, jako je třída směrování Laravels.

V našem testu bude naší třídou, která bude definovat trasu, http_server / index.php a vrací pouze odpověď takto:

Nastavení RESTFUL bez směrování

V našem dalším testu kódu vypneme směrování úplně. Místo toho budeme mít přímou HTTP odpověď v http_server / get.php. Poměrně Jednoduše a přímo.

Test serveru Socket

V našem posledním testu budeme mít Socket Server. Nyní chci, abyste si chvilku uvědomili, že test soketu provádí další krok, protože dva testy HTTP nejsou - jeho dešifrovací a šifrovací data!

Šifrování vyžaduje nejen čas, ale také prodlužuje délku odesílaných dat. Další přímý test, který po odeslání informace pouze pošle zpět:

Klient odešle test

Klient pro odeslání testu se skládá ze dvou odeslaných žádostí CURL a 1 testu Socket. Data odeslaná do všech koncových bodů jsou stejná, kromě toho, že soket musí nejprve zašifrovat data. Jeden požadavek CURL je GET a druhý POST. Kód níže:

A pojďme test!

Výsledky testů

Test 1: 100 žádostí

Čas směrování HTTP: 0,39216995239258

HTTP GET Time (No Routing): 0.33528399467468

Testovací čas zásuvky: 0,082527875900269

Test 2: 500 žádostí

Čas směrování HTTP: 1,8593518733978

HTTP GET Time (No Routing): 1.5577518939972

Testovací čas Socket: 0,37446594238281

Test 3: 1000 žádostí

Čas směrování HTTP: 4.1550130844116

HTTP GET Time (No Routing): 3,1718351840973

Socket Test Time: 0,72313618659973

Důležitá poznámka: Stejný test byl spuštěn s požadavkem GET na implementaci směrovače, aby byl srovnatelnější s jiným testem GET. Výsledky byly stejné.

Analýza zkoušek

Při 100 požadavcích je HTTP bez směrování o 15% rychlejší než při směrování. A pomocí zásuvky byla rychlost o 130% rychlejší. Když se zatížení zvýšilo na 1 000 požadavků, výkonová mezera mezi HTTP a směrováním byla bez 26% a ve srovnání se soketem byl rozdíl 140%. To je docela kontrast!

Tento bod by měl být znovu uveden: Sokety šifrují a dešifrují data a stále překonávají HTTP!

Nyní na obranu HTTP jsou záhlaví HTTP obrovské! Přemýšlejte o všech informacích, které přecházejí do záhlaví:

  • Typ obsahu
  • Charset
  • Allow-Access-Control- *
  • Kód odezvy
  • X-Forwarded-For
  • Vzdálená adresa
  • Metoda požadavku
  • atd. atd. atd

Seznam může pokračovat s mnoha položkami, které obsahují hlavičky HTTP. Tato informace je spousta dat, která mají být zpracována nejen pro odeslání, ale pro zpracování přijímajícího serveru. Programování soketu je přímější, pokud se připojujete k koncovému bodu a pouze odesíláte data.

Jídlo s sebou, pro mikroservisy

Chcete-li výše uvedený příklad spustit na svém místním, můžete navštívit repo zde.

Při vytváření svých mikroservisů je REST skvělý přístup k vytváření mikroprocesů, které jsou snadno přístupné, uspořádatelné a srozumitelné - zejména pro komplexní API. Ale výkon REST je extrémně pomalý ve srovnání se zásuvkami. Úspora RESTu spočívá v tom, že u některých klientů, jako je Javascript, může asynchronní komunikace pomoci s problémy s výkonem.

Při konstrukci vašich mikroprocesů zvažte kompromisy ohledně rychlosti kvůli udržovatelnosti. Kolik požadavků zpracovávají vaše mikroservisy a jak by změna přinesla firmě výhody? Existuje řešení, které dokáže přijímat požadavky HTTP rychleji než PHP, ale pak je rychle odeslat do služby PHP přes soket? Potřebuje mikroskopická služba REST API?

Pokud je vyžadován HTTP a chcete zvýšit rychlost, zvažte:

  • Odebrání nafouknutého routeru z implementace na holá minimální řešení.
  • Vzhledem k jeho malé mikroskopické službě napište vlastní router bez skutečné funkčnosti, ale s podmíněnými příkazy (tj. Pokud ($ request == 'GET') {// Do Action} else {// Do Other Action}.
  • Zmenšete velikost odeslaných informací, tj. Zahoďte pole záhlaví, která nejsou nezbytná.

Další návody

Pokud se chcete dozvědět více o Microservices s PHP, přečtěte si některé z našich dalších tutoriálů:

  • Použití fronty systému s RabbitMQ
  • Vytvořte Restful CRUD API
  • Organizace přístupu k více službám
  • Ověřování a autorizace
  • Funkční programování a testování jednotek