Autocompletado instantáneo para 240 millones de dominios: p99 0 ms*
P99 0 ms* autocomplete for 240M domain names
El creador de Wirewiki explica cómo logró un autocompletado casi instantáneo para 240 millones de nombres de dominio. La clave está en precargar las sugerencias en el cliente mientras el usuario teclea, combinado con una API ultrarrápida que usa un trie en memoria para los dominios populares y un índice de bloques mapeado en memoria para el resto. Las pruebas de carga muestran latencias de pocos milisegundos, y el autor detalla los trucos de ingeniería y las limitaciones prácticas.
El autocompletado es la principal forma de navegar por Wirewiki, así que debe ser lo más completo, preciso y rápido posible; quiero que sea instantáneo, como en el siguiente fotograma.
- skybrian
Este autocompletado sugiere dominios que no existen. Puedes escribir cualquier basura y sugerirá algo, pero luego, si vas allí, no hay registros.
Parece que uno de los propósitos de un cuadro de autocompletado es ayudarte a evitar errores tipográficos, así que eso lo hace menos útil.
- chrismorgan
Usar keyup no tiene sentido y es inconsistente con las expectativas del usuario. Para desencadenar acciones (lo que incluye escribir normalmente), solo se usa keydown. (Bueno, hay una excepción por razones que no me quedan claras: activar un botón presionando la barra espaciadora. Eso se dispara en keyup, como los clics que ocurren al soltar, mientras que Enter se dispara en keydown.) Keyup se limita a cosas donde reaccionas constantemente al estado de una tecla, como es común en los juegos.
Esto también afecta la funcionalidad. De hecho, introduce latencia al usar keyup en lugar de keydown. Se siente mal.
- ViscountPenguin
Desafortunadamente, este enfoque no se siente muy bien aquí en Australia, definitivamente es una función de la latencia.
Creo que podrías acercarte mucho más planteándolo como un problema de optimización, donde uses el diccionario completo del alfabeto, pero agregues una predicción residual que apunte a cubrir tanto del árbol de nombres de dominio restante como sea posible, ponderado por popularidad. Este árbol podría luego precocinarse y almacenarse con el mismo sistema. Esto probablemente te daría p99 0ms incluso en Australia.
- oersted
¿Por qué no simplemente disparar la búsqueda en keyDown y mostrarla tan pronto como llegue la respuesta, como es habitual?
El tiempo que toma presionar una tecla es un objetivo razonable para la latencia de la API, supongo, pero sigue siendo un objetivo arbitrario. Esperar a mostrar hasta keyUp solo agrega más latencia si tu API es más rápida. Tenerlo sincronizado con keyUp no me hace sentir que es más inmediato.
- kevmo314
Si quieres reducir aún más la latencia de red, puedes almacenar cada nodo del trie como un archivo, nombrándolo convenientemente con la ruta del prefijo a ese nodo. Luego, vuelcas los cientos de millones de archivos en R2.
¡Ahora el recorrido se puede hacer completamente mediante búsquedas CDN!