k47.cz

mastodon twitter RSS
bandcamp explorer
««« »»»

Jedna milisekunda na komentáře

10. 6. 2020 — k47

Komentářová sekce tady na k47čce rozhodně neúpí & nesténá pod extrémním náporem komentátorů, kteří musí, musí, musí přidat vlastní názor a vlastní slova do nekonečné studnice digitálního šumu. Jde o celkem tichou a spořádanou končinu internetu, kde se nic moc neděje. Přesto by ale mohla být lepší. Mohla by být rychlejší.

Komentáře představují jednu z mála dynamických komponent na přerozené k47čce, která je jinak zcela statický web. Celou tuhle díra pojí jeden jednotící étos: low-tech — dosáhnout užitečného stavu s nejprimitivnější možnou výbavou. Představte si zarostlého chlapa, jak ostří jeden konec klacku a plánuje, že ním pořídí večeři. Tak to tady funguje celkově a komentáře specificky: žádná databáze, jen prostý soubor s JSONy, jeden komentář na jednom řádku. Je docela zábavné, když se v logu webserveru objeví pokusy o SQL injection útoky; zábavné protože tu neběží žádná SQL databáze, na kterou by se dalo zaútočit.

Komentářů není moc, dohromady stovky a/nebo tisíce, sekce se vykreslí za pár milisekund, deset maximálně, stále dost rychle, ale na druhou stranu čas roste úměrně s celkovým počtem komentářů. Každý je třeba načíst, dekódovat a vyfiltrovat ty správné. V IT hantýrce se říká, že časová komplexita je O(n).

Můžeme toho dosáhnout rychleji? Třeba za jednu milisekundu? Od začátku až do konce? Od okamžiku, kdy PHP skript začne běžet, do okamžiku, kdy je zapsán poslední bajt odpovědi? A přitom se stále řídit low-tech étosem? Ukazuje 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 komentářů má dvě využití – jednak ukázat posledních X komentářů & druhak ukázat všechny k určitému článku. Jak to teď funguje? Více méně stejně jako dřív. Stále tu není žádná databáze.

První use case (když mi dovolíte opět použít argot IT plebsu) je snadný. Ze souboru s komentáři stačí načíst posledních X kilobajtů, rozlámat to na řádky, ignorovat první, protože je nekompletní a dál postupovat jako zastara. Nedá to přesně X posledních komentářů, ale na přesnosti extra nezáleží, stačí když se ukáže ±pár posledních komentů a hlavně, že je to rychlé (což je).

Druhý use case byl o něco komplikovanější. Je třeba vytáhnout komenty náležící danému článku, které jsou různě roztroušené po souboru s JSONy. Pro řešení je třeba si zajít do světa databází. Žádná tu pořád není, to se nemění. Jen jsem vystavěl jednoúčelový pomocný index odkazující na pozice, kde v souboru začíná a končí řádek s komentářem. Vystavět persistentní navigovatelnou hash-tabulku není komplikované, měřeno jak lidskou tak počítačovou prací (SQL dotaz by zabral méně úsilí než asi 100 řádek kódu, pravda, ale visí nad mnou závazek primitivismu). Jak je teď napsaný, index nejde dynamicky aktualizovat a přestavuje se vždy po přidání komentáře. Stále prochází všechny komenty, jen teď se to děje při přidání nového, což se stává mnohem méně často. Dokonce by se dalo říct, že sporadicky.

Takže ano, počítače jsou rychlé a dá se snadno dostat na nahodilou metu 1ms i když to nedává valný smysl. Okamžiky zrychlení se ztratí v ostatních krocích načítání stránky. Odezva DNS, připojování, navázání TLS zcela dominují času.


+1: Jo a taky se teď aktualizují počty komentářů pod články. Protože jde o statický web, koment skript yolo stylem patchne html soubor s danou stránkou.

+2: Dávám tomu tři dny, než se to celé rozbije. Už je to rozbité. Opraveno.

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