Villámgyors domain-súgás: így építsd fel percek alatt
Hogyan érezheted úgy, hogy a domain keresőd varázslat?
Írtál már valamit egy keresőbe, és az自动완성 mielőtt beütnéd a következő karaktert, megjelent? Nem mágia – ez mérnöki munka. És igazán érdekes probléma, amikor 240 millió domain névvel dolgozol.
A sebesség nem játék
Amikor valaki begépel valamit egy keresőmezőbe, azonnali eredményt vár. A Nielsen Norman Group kutatásai szerint 0.1 másodperc az a küszöb, ami alatt a felhasználó úgy érzi, hogy mindent azonnal kap. Ha lassabb, az interfész már lassúnak tűnik – és ez撤打断了 a felfedezés folyamatát.
Egy domain ellenőrző toolnál, mint a Wirewiki, az autocomplete a fő belépési pont. Minden milliszekundum számít, amikor gyorsan DNS rekordokat akarsz megnézni. A felhasználónak úgy kell éreznie, hogy az eszköz olvas a gondolataiban, nem pedig a szerverre vár.
A Prefetching Trükk
Itt jön a szép rész: a kulcs nem az, hogy gyorsabb legyen az API (bár az is segít). Hanem az, hogy ellopjuk az időt magától a gépelési folyamattól.
Amikor a felhasználó lenyom egy billentyűt (keyDown), előre lekérjük a tippeket arra, amit gépel, plusz a következő valószínű karakterre. Amikor felengedi (keyUp), megjelenítjük, ami éppen kész van. Ez azt jelenti, hogy az időbudget nem az API késése – hanem két billentyűleütés ideje plusz a köztük lévő szünet.
Egy 60Hz-es kijelzőn 16.7ms van egy frame-re. A budget körülbelül 121ms gyors gépelőknél a p99-nél. Ennyi az ablak. Készítsd elő az eredményeket a második billentyűleütés végéig, és a felhasználó számára úgy tűnik, mintha azonnal megtörtént volna.
Sebességre Tervezés, Méretben
Az API-nak 240 millió domain névvel kell megbirkóznia, erőlködés nélkül. Az okos megközelítés itt az, hogy a népszerű domaineket másképp kezeljük, mint a hosszú farok尾部:
A Fej: A top domainek egy karakter trie-ban élnek, teljesen a memóriában. A prefix keresések csak pointer séták – gyorsak és kiszámíthatóak. Minden lehetséges prefix első 8 tippje előre ki van számolva. Legrosszabb eset? O(beviteli hossz). Ez elenyésző.
A Farok: Minden más egy SSD-n van, memóriával leképezett block indexxel. A domainek rendezettek, delta-kompresszáltak, és fix méretű blockokba szervezettek, egy kis memóriabeli directoryval bináris kereséshez. A 240M domain körülbelül 2.5GB, és az OS automaticusan cache-eli a hot page-eket.
Mindkét struktúrának korlátos a bemenete – a domainek száma és a query hossz nem nő korlátlanul. Ez gyakorlatilag O(1) komplexitást jelent, és a p99 latency folyamatosan alacsony marad.
A Számok Nem Hazudnak
A stressz tesztelés valami érdekeset mutatott. maga az API a legtöbb kérést 2ms alatt válaszolja meg. Még terhelés alatt, 1,600 kérés/másodperc mellett is, az Nginx és az API 15ms alatt válaszol p99-nél. Egész solid.
De itt jön a valóság: a hálózat. A gyakorlatban az end-to-end latency egyenlő a round-trip time-nal a böngészőtől a Cloudflaron át a szerverig, plusz körülbelül 10ms overhead. Azoknak a felhasználóknak, akik a szerverrel azonos régióban vannak, beleférnek a budgetbe. Minden másnak? Itt jön a csillag.
A Csillag
p99 0ms* azt jelenti, hogy a kérések 99%-a a felhasználó befejezi a billentyűleütést előtt visszaérkezik, feltéve hogy közel van a szerverhez. Adj hozzá 100-200ms transzatlanti latencyt, és hirtelen túl vagy a budgeten.
A javítás geo-elosztott szerverek lennének load balancing-gal. De egy side projectnél ez rengeteg infrastruktúra karbantartásához vezet. Néha a "elég jó" tényleg elég jó – főleg amikor a célfelhasználók european fejlesztők, akik domaineket ellenőriznek.
Mit Jelent Ez a Következő Projekteden?
Van itt egy tanulság, ami messze túlmutat a domain kereséseken: okosan prefetchelj. Ha tudod, mit fognak a felhasználók legközelebb kérni, kérd le még előtte. Hagyd, hogy a UI reagáljon arra, ami kész van, ahelyett hogy a bizonyosságra vársz.
A második tanulság az adatstruktúra választásról szól. Egy trie a hot data-nak, egy jól indexelt rendezett struktúra a maradéknak. Nem kell 240 millió elemet a RAM-ban tartanod, ha megtervezed a hozzáférési mintákat az actualisan valószínű kérések köré.
Végül: mérd meg a valós budgeted. Ebben az esetben két billentyűleütés plusz szünet. Mi a te equivalented? Találd meg, optimalizáld hozzá, és ne menj túl rajta.
Az eredmény úgy tűnik, mintha varázslat lenne. De azzal kezdődik, hogy pontosan megérted, mennyi időd van.