Szybciej niż myśl: budowanie natychmiastowego autouzupełniania domen
Dlaczego autocomplete działa szybciej niż myślisz
Zdarzyło Ci się kiedyś, że podpowiedź pojawiła się zanim zdążyłeś wcisnąć klawisz? To nie magia — to inżynieria. I to całkiem fascynujący problem, gdy pracujesz z bazą 240 milionów nazw domen.
Prędkość ma znaczenie
Użytkownicy wpisujący tekst w pole wyszukiwania oczekują natychmiastowych wyników. Specjaliści z Nielsen Norman Group ustalili, że próg 0,1 sekundy to moment, w którym interakcja wydaje się błyskawiczna. Wszystko wolniej — i interfejs zaczyna sprawiać wrażenie ociężałego, psując płynność pracy.
Dla narzędzia do sprawdzania domen jak Wirewiki, autocomplete to główna brama wejściowa. Każda milisekunda jest na wagę złota, gdy chcesz szybko wyciągnąć rekordy DNS. Użytkownik powinien czuć, że narzędzie czyta w jego myślach, a nie czeka na odpowiedź serwera.
Trik z podglądem
Oto najciekawsza część: kluczowa idea wcale nie polega na przyspieszeniu API (choć to тоже pomaga). Chodzi o kradzież czasu z samego procesu wpisywania.
Gdy użytkownik naciska klawisz (keyDown), system pobiera podpowiedzi dla tego, co już wpisał, plus następny prawdopodobny znak. Gdy puszcza klawisz (keyUp), wyświetla to, co jest gotowe. To oznacza, że Twój budżet czasowy to nie opóźnienie API — tylko czas dwóch wciśnięć klawisza plus przerwa między nimi.
Na ekranie 60Hz masz 16,7 ms na klatkę. Dla szybkich skrypciarzy (percentyl 99) budżet wynosi około 121 ms. Tyle masz okna. Przygotuj wyniki przed końcem drugiego wciśnięcia — i dla użytkownika wygląda to na natychmiastowe.
Projektowanie z myślą o skali
API musi obsłużyć 240 milionów domen bez zająknięcia. Sprytne podejście polega na traktowaniu popularnych domen inaczej niż reszty:
Szczyt: Najpopularniejsze domeny mieszkają w drzewie trie trzymanym w całości w pamięci. Wyszukiwanie po prefiksie to po prostu przechodzenie przez wskaźniki — szybkie i przewidywalne. Top 8 podpowiedzi dla każdego możliwego prefiksu jest wstępnie obliczone. Najgorszy przypadek? Złożoność O(długość wpisanego tekstu). Czyli malutka.
Ogón: Wszystko inne leży na SSD z blokowym indeksem mapowanym w pamięci. Domeny są posortowane, skompresowane metodą delta i poukładane w blokach o stałym rozmiarze. Mały katalog w pamięci pozwala na wyszukiwanie binarne. Te 240M domen zajmuje około 2,5 GB, a system operacyjny sam zarządza cache'owaniem często używanych stron.
Obie struktury mają ograniczone wejścia — liczba domen i długość zapytania nie rosną w nieskończoność. To sprawia, że efektywna złożoność jest praktycznie stała, a opóźnienia p99 pozostają niskie.
Liczby nie kłamią
Testy obciążeniowe pokazały coś ciekawego. API samo w sobie odpowiada na większość zapytań w mniej niż 2 ms. Pod dużym obciążeniem przy 1600 zapytaniach na sekundę, Nginx plus API odpowiada w 15 ms przy p99. Całkiem niezłe.
Ale tutaj wkracza rzeczywistość: sieć. W praktyce całkowite opóźnienie to czas rundy od przeglądarki przez Cloudflare do serwera, plus około 10 ms narzutu. Dla użytkowników w tym samym regionie co serwer — jesteś w budżecie. Dla wszystkich innych? To jest gwiazdka.
Gwiazdka
p99 0 ms* oznacza, że 99% zapytań zwraca wyniki zanim użytkownik skończy wciskać klawisz, zakładając że jest blisko serwera. Dodaj 100-200 ms opóźnienia transatlantyckiego — i nagle wychodzisz poza budżet.
Rozwiązanie? Serwery rozmieszczone geograficznie z load balancingiem. Ale dla projektu robionego po godzinach to sporo infrastruktury do utrzymania. Czasem "wystarczająco dobre" naprawdę wystarczy — zwłaszcza gdy Twoimi głównymi użytkownikami są europejscy developerzy sprawdzający domeny.
Co z tego wynika dla Twojego projektu
Jest tu lekcja, która wykracza poza wyszukiwanie domen: podglądaj mądrze. Jeśli wiesz, czego użytkownicy mogą szukać za chwilę — pobierz to wcześniej. Niech interfejs reaguje na to, co jest gotowe, zamiast czekać na pewność.
Druga lekcja dotyczy wyboru struktury danych. Trie dla gorących danych, dobrze indeksowana struktura posortowana dla reszty. Nie musisz trzymać 240 milionów rzeczy w RAM, jeśli zaprojektujesz wzorce dostępu wokół tego, co rzeczywiście będzie potrzebne.
Na koniec — zmierz swój rzeczywisty budżet. W tym przypadku: dwa wciśnięcia klawisza plus przerwa. Co jest Twoim odpowiednikiem? Znajdź go, zoptymalizuj pod niego i przestań optymalizować dalej.
Rezultat wygląda jak magia. Ale zaczyna się od zrozumienia, ile dokładnie czasu naprawdę masz.