Domain Otomatik Tamamlamada Şimşek Hızı Nasıl Yakalanır?
Arama Kutusuna Yazarken Karşına Çıkan Öneriler: Arkasında Yatan Mühendislik
Hiç bir şeyler yazarken, kelimeyi bitirmeden önce önerinin ekranda belirdiğini gördün mü? İşte bu bir büyü değil — altında yatan ince bir mühendislik var. Üstelik 240 milyon domainle uğraşıyorsanız, bu gerçekten de ilginç bir problem haline geliyor.
Hızın Önemi
Kullanıcılar arama kutusuna bir şeyler yazdığında, sonuçların anında gelmesini bekliyor. Nielsen Norman Group'un araştırmasına göre 0.1 saniye, kullanıcıların işlemin "anında" gerçekleştiğini hissettiği eşik değer. Bundan yavaş olan her şey, arayüzü ağır hissettirmeye başlıyor — keşfetme akışını bozuyor.
Wirewiki gibi bir domain inceleme aracı için autocomplete, kullanıcının ilk temas noktası. DNS kayıtlarına bakmak için uğraşırken her milisaniye önemli. Kullanıcı, aracın sunucuyu beklemek yerine sanki zihnini okuyormuş gibi hissetmeli.
Zamanı Çalmak
İşin güzel tarafı şu: kilit fikir API'yi hızlandırmak değil (tabii o da işe yarıyor). Asıl mesele, kullanıcının yazma süresinden zaman çalmak.
Kullanıcı bir tuşa bastığında (keyDown), yazmakta olduğu şeyin ve muhtemel sonraki karakterin önerilerini prefetch et. Tuşu bıraktığında (keyUp), hazır olan ne varsa onu göster. Bu sayede zaman bütçen artık API gecikmesi değil — iki tuş basışının süresi ve aralarındaki boşluk.
60Hz bir ekranda her frame için 16.7ms var. P99 hızında yazan kullanıcılar için bütçe yaklaşık 121ms'ye denk geliyor. İşte senin penceren bu. İkinci tuşa basış bitmeden önce sonuçları hazırla, kullanıcıya her şey anlık geliyormuş gibi görünsün.
Ölçekte Hız Nasıl Tasarımlanır
API, 240 milyon domaini kaldırabilecek kapasitede olmalı. Buradaki akıllı yaklaşım, popüler domainleri geri kalanlardan farklı şekilde ele almak:
Başı (Hot Data): En çok aranan domainler tamamen bellekte tutulan bir karakter trie'inde yaşıyor. Ön ek aramaları sadece pointer yürüyüşleri — hızlı ve öngörülebilir. Her olası ön ek için en iyi 8 öneri önceden hesaplanmış. En kötü senaryo mu? Girilen inputun uzunluğu kadar. Yani oldukça küçük.
Kuyruğu (Long Tail): Geri kalan her şey SSD üzerinde, bellek-eşlenmiş blok indekslemesiyle duruyor. Domainler sıralı, delta-sıkıştırılmış ve sabit boyutlu bloklarda organize edilmiş; ikili arama için küçük bir bellek-içi dizin var. 240M domain yaklaşık 2.5GB yer kaplıyor ve işletim sistemi sık kullanılan sayfaların önbelleğini otomatik yönetiyor.
Her iki yapı da sınırlı girdilere sahip — domain sayısı ve sorgu uzunluğu sonsuza kadar büyümüyor. Bu da etkili karmaşıklığı pratikte O(1) yapıyor, p99 gecikmesini tutarlı şekilde düşük tutuyor.
Sayılar Yalan Söylemiyor
Stres testleri ilginç bir şey gösterdi. API'nin kendisi çoğu isteği 2ms'nin altında yanıtlıyor. Saniyede 1.600 istek yükü altında bile Nginx ile birlikte p99'da 15ms cevap veriyor. Hiç fena değil.
Ama gerçeklik devreye girdiğinde iş değişiyor: ağ. Pratikte uçtan uca gecikme, tarayıcıdan Cloudflare'a, oradan sunucuya gidiş-dönüş süresi artı yaklaşık 10ms ek yük. Sunucuya yakın bölgedeki kullanıcılar için bütçe dahilindesisin. Ya da diğer herkes için? İşte sorun burada.
O Yıldız İşareti
p99 0ms* demek, kullanıcı sunucuya yakınsa tuş basışını bitirmeden önce sonuçların %99'unun döndüğü anlamına geliyor. Üstüne 100-200ms transatlantik gecikme ekle, ve bütçeyi aştın.
Çözüm coğrafi dağıtımlı sunucular ve yük dengeleme olurdu. Ama bir yan proje için bu kadar altyapıyı idame ettirmek büyük iş. Bazen "yeterince iyi" gerçekten yeterli — özellikle hedef kitlen European geliştiricilerse.
Projen İçin Çıkarılacak Dersler
Domain aramalarının çok ötesinde uygulanabilecek bir ders var: akıllı prefetch yap. Kullanıcıların bir sonraki adımda ne isteyebileceğini biliyorsan, sormadan önce getir. UI'ın kesinliği beklemek yerin, hazır olana tepki vermesine izin ver.
İkinci ders veri yapısı seçimiyle ilgili. Sık erişilen veri için trie, geri kalan her şey için iyi indekslenmiş sıralı yapı. 240 milyon kaydı RAM'de tutmak zorunda değilsin — tasarımı gerçekten ne talep edilecek üzerine kurarsan, buna gerek kalmaz.
Son olarak, gerçek bütçeni ölç. Bu durumda iki tuş basışı ve aradaki boşluk. Senin karşılığın ne? Onu bul, optimize et, ve ötesine geçme.
Sonuç büyü gibi hissettiriyor. Ama her şey aslında ne kadar zamanın olduğunu tam olarak anlamakla başlıyor.