Feature-request: Propojení Nette a ReactPHP
- 2bfree
- Člen | 248
Chtěl bych Nette jako základ pro microservice worker, tedy něco co poběží jako proces na serveru, který bude přijímat requesty a odpovídat na ně, aniž by to pokaždé umřelo.
Vytvořili jsme jednoduché react jádro a poněkud neohrabaně využíváme jednotlivých komponent z Nette. Potkali jsme jeden starší projekt, který se to pokusil udělat systémově, ale už je dost starý: https://github.com/…/nette-react
Dotaz zní, co si o možnosti propojení Nette+React myslí sám @DavidGrudl a kolik by přípdně stál vývoj této feature?
- 2bfree
- Člen | 248
Rád bych zachoval myšlenku, jakou funguje Nette, tedy v React loop vzal object typu React\Request a React\Response a ty předal do Nette a nchal dále zpracovat standardní cestou. Presenter vrstva by se následně měla postarat o decode/encode z JSON, MsgPack, … postarat o autentizaci a autorizaci etc.
- David Grudl
- Nette Core | 8282
@2bfree: ad https://twitter.com/…552370638848
Tohle jsem fakt nepochopil jako poptávku po práci, kterou ti mám nacenit. Je
to moc hrubé zadání, spíš jen nástřel nápadu, kterému úplně
nerozumím.
- 2bfree
- Člen | 248
Principielně jde o to, že se v současné době se při každém requestu na serveru, kde běží aplikace v Nette, musí celá aplikace sestavit, aby obsloužila požadavek a následně se uvolnila z paměti a tak stále dokola.
V případě problematiky microservice se pracuje s velkým množstvím opravdu jednoduchých requestů s tím, že čas zmíněný výše převyšuje čas potřebný pro získání samotného výsledku.
reactphp umí běžet jako služba na pozadí, přijímat requesty a odpovídat na ně aniž by se musela celá aplikace stále sestavovat. Díky tomu lze ušetřit více jak 50% času potřebného na zpracování požadavku a to není málo, zvlášť při větší zátěži.
V současné době Nette při svěm běhu sestaví objeky Request a Response na základě dat od serveru a tyto předává do Routeru a začíná celé aplikační flow.
Když by se objekty Request a Response naplnily daty z reactphp tak by to IMHO mělo vyřešit celý problém.
Tedy na serveru bych spustil službu přes
/usr/bin/php ~/www/service/www/react-index.php
a nasměroval nginx na tuto service.
O něco podobného se již snažilo dříve, ale žel vývoj ustal.
Dotaz tedy zní, co si o tom @DavidGrudl myslí a kolik by případně stál tento vývoj?
- David Grudl
- Nette Core | 8282
A proč je tam nutné Nette? Respektive chápal bych, že server bude posílat nějaké JSON response, což umí ReactPHP sám o sobě, ne?
Předělat presenter & application na ReactPHP by asi šlo, ale nevidím v tom tu přidanou hodnotu. Odhadovat náklady si netroufám.
- Filip Procházka
- Moderator | 4668
Nevidím důvod dávat to do Nette. Ovšem je to výborný argument zamyslet
se nad předěláním Http\Response na value object a ne službu. Stejně jako
jsem předělal https://github.com/…RequestStack.
App\Request a response ti zkrátka stačit nebudou, bude potřeba vyřešit
minimálně i Http\Request
, Http\Response
a
Http\Session
.
Ovšem i tohle jsou věci, které je úplně v pohodě možné udělat bez zásahu do Nette. Tady máš hodně hrubý nástřel https://github.com/…rver-sandbox
- David Grudl
- Nette Core | 8282
On nejspíš @martinox netuší, jaký je rozdíl mezi Facebook React a ReactPHP.
- David Matějka
- Moderator | 6445
mimochodem, i react od fb je integrovany do php :D https://github.com/…act-php-v8js (ale to uz tak trochu masochismus je, no..)
- 2bfree
- Člen | 248
Přidané hodnoty Nette jsou:
- Presenter vrstvoa, která již teď umí přijmout vstupní parametry
v libovolném pořadí a zavolat příslušnou metodu, které předá
potřebné parametry
->tryCall()
- DI
- snadné propojení s Doctrine
- Autorizace & Autentizace
- Podpora pro eventy
Ačkoliv se bavíme o „microservice“, je to pořád celkem komplexní úkol.
Nejde však jen o tento use-case. Jakmile by byl vytvořen plnohodnotný react spouštěč, tak by se i běžné Nette aplikace mohli spouštět takto a přidaná hodnota by byla v rychlosti.
- 2bfree
- Člen | 248
Od té doby, co je Nette „Dev stack“, tak by to byl jen další „Modul“ a bylo by na tobě, jestli si to stáhneš nebo ne. Jinak máš pravdu, že jedna z věcí na kterou jsme narazili byla v tom, že tebou zmíněné části Nette jsou „moc chytré“ a je tedy težké nahradit jednu vrstvu druhou.
Zkusil jsem tento úkol jako takovou vlaštovku pro „placenou verzi Nette“. Když to vezmu jako příklad, tak se dá domluvit ve firmě, že tu máme prostor na zlepšení naší aplikace, bude to stát tolik a tolik a nesebere to tolik času našich vývojářů. Přijde mi to mnohem transparentnější, než lobovat za příspěvky na něco „abstraktního“ s nejasnými podmínkami.
- 2bfree
- Člen | 248
Při té příležitosti jsme narazili na problém, že Presenter->getUser() je vázáno na celý životní cyklus aplikace a ne na Request. Tedy, že se nepočítá s tím, že by v jednom životním cyklu přišlo více requestů.
Kdyby se tomu někdo dále věnoval, tak by bylo vhodné toto přepracovat.