k47.cz
výběr kolo foto Praha povídky kultura
TECH ▞▞ | twitter RSS
««« »»»

Jedna milisekunda na komentáře

10. 6. 2020 — k47

Ko­men­tá­řová sekce tady na k47čce roz­hodně neúpí & ne­sténá pod ex­trém­ním ná­po­rem ko­men­tá­torů, kteří musí, musí, musí přidat vlastní názor a vlastní slova do ne­ko­nečné stud­nice di­gi­tál­ního šumu. Jde o celkem tichou a spo­řá­da­nou kon­činu in­ter­netu, kde se nic moc neděje. Přesto by ale mohla být lepší. Mohla by být rych­lejší.

Ko­men­táře před­sta­vují jednu z mála dy­na­mic­kých kom­po­nent na pře­ro­zené k47čce, která je jinak zcela sta­tický web. Celou tuhle díra pojí jeden jed­no­tící étos: low-tech — do­sáh­nout uži­teč­ného stavu s nej­pri­mi­tiv­nější možnou vý­ba­vou. Před­stavte si za­rost­lého chlapa, jak ostří jeden konec klacku a plá­nuje, že ním pořídí večeři. Tak to tady fun­guje cel­kově a ko­men­táře spe­ci­ficky: žádná da­ta­báze, jen prostý soubor s JSONy, jeden ko­men­tář na jednom řádku. Je docela zá­bavné, když se v logu web­ser­veru objeví pokusy o SQL in­jection útoky; zá­bavné pro­tože tu neběží žádná SQL da­ta­báze, na kterou by se dalo za­ú­to­čit.

Ko­men­tářů není moc, do­hro­mady stovky a/nebo tisíce, sekce se vy­kreslí za pár mi­li­sekund, deset ma­xi­málně, stále dost rychle, ale na druhou stranu čas roste úměrně s cel­ko­vým počtem ko­men­tářů. Každý je třeba načíst, de­kó­do­vat a vy­fil­tro­vat ty správné. V IT han­tý­rce se říká, že časová kom­ple­xita je O(n).

Můžeme toho do­sáh­nout rych­leji? Třeba za jednu mi­li­sekundu? Od za­čátku až do konce? Od oka­mžiku, kdy PHP skript začne běžet, do oka­mžiku, kdy je zapsán po­slední bajt od­po­vědi? A přitom se stále řídit low-tech étosem? Uka­zuje se, že je možné ano i když nedává smysl tlačit tak silně na něco, co má tak malý efekt. Ale proč ne? Hodně věcí nedává smysl, ale jsou jen zá­bavné.

Sekce ko­men­tářů má dvě vy­u­žití – jednak ukázat po­sled­ních X ko­men­tářů & druhak ukázat všechny k ur­či­tému článku. Jak to teď fun­guje? Více méně stejně jako dřív. Stále tu není žádná da­ta­báze.

První use case (když mi do­vo­líte opět použít argot IT plebsu) je snadný. Ze sou­boru s ko­men­táři stačí načíst po­sled­ních X ki­lo­bajtů, roz­lá­mat to na řádky, ig­no­ro­vat první, pro­tože je ne­kom­pletní a dál po­stu­po­vat jako za­stara. Nedá to přesně X po­sled­ních ko­men­tářů, ale na přes­nosti extra ne­zá­leží, stačí když se ukáže ±pár po­sled­ních ko­mentů a hlavně, že je to rychlé (což je).

Druhý use case byl o něco kom­pli­ko­va­nější. Je třeba vy­táh­nout ko­menty ná­le­žící danému článku, které jsou různě roz­trou­šené po sou­boru s JSONy. Pro řešení je třeba si zajít do světa da­ta­bází. Žádná tu pořád není, to se nemění. Jen jsem vy­sta­věl jed­no­úče­lový po­mocný index od­ka­zu­jící na pozice, kde v sou­boru začíná a končí řádek s ko­men­tá­řem. Vy­sta­vět per­si­s­tentní na­vi­go­va­tel­nou hash-ta­bulku není kom­pli­ko­vané, měřeno jak lid­skou tak po­čí­ta­čo­vou prací (SQL dotaz by zabral méně úsilí než asi 100 řádek kódu, pravda, ale visí nad mnou zá­va­zek pri­mi­ti­vismu). Jak je teď na­psaný, index nejde dy­na­micky ak­tu­a­li­zo­vat a pře­sta­vuje se vždy po při­dání ko­men­táře. Stále pro­chází všechny ko­menty, jen teď se to děje při při­dání nového, což se stává mnohem méně často. Do­konce by se dalo říct, že spo­ra­dicky.

Takže ano, po­čí­tače jsou rychlé a dá se snadno dostat na na­ho­di­lou metu 1ms i když to nedává valný smysl. Oka­mžiky zrych­lení se ztratí v ostat­ních kro­cích na­čí­tání stránky. Odezva DNS, při­po­jo­vání, na­vá­zání TLS zcela do­mi­nují času.


+1: Jo a taky se teď ak­tu­a­li­zují počty ko­men­tářů pod články. Pro­tože jde o sta­tický web, koment skript yolo stylem patchne html soubor s danou strán­kou.

+2: Dávám tomu tři dny, než se to celé roz­bije. Už je to roz­bité. Opra­veno.

píše k47 & hosté, ascii@k47.cz