2010-12-09 23 views
11

Encontré un sitio que hace algo muy similar a Google Suggest. Cuando escribe 2 caracteres en el cuadro de búsqueda (por ejemplo, "ca" si está buscando productos "canon"), realiza 4 solicitudes Ajax. Cada solicitud parece hacerse en menos de 125 ms. He observado casualmente Google Suggest tomando 500ms o más.Solicitudes/respuestas Ajax: ¿cómo hacerlas más rápidas?

En cualquier caso, ambos sitios son rápidos. ¿Cuáles son los conceptos/estrategias generales que se deben seguir para obtener solicitudes/respuestas súper rápidas? Gracias.

EDIT 1: por cierto, planeo implementar una función de autocompletar para una búsqueda de sitio de comercio electrónico donde 1.) proporciona una sugerencia de búsqueda basada en lo que se escribe y 2.) una lista de posibles productos coincide con en lo que ha sido escrito hasta ahora. Estoy intentando algo similar a la búsqueda de Sistemas SLI (ver http://www.bedbathstore.com/ por ejemplo).

Respuesta

9

Esto es un poco de "¿cuánto tiempo es una pieza de cadena?" Pregunta y estoy haciendo de esto una respuesta wiki de la comunidad   — todos pueden entrar.

Yo diría que es una cuestión de asegurar que:

  1. La granja/servidor/servidor de la nube está consultando tiene el tamaño correcto de acuerdo a la carga que está lanzando en ella y/o puede cambiar el tamaño sí mismo de acuerdo con esa carga
  2. El servidor/granja de servidores/nube está conectado a una buena red troncal rápida
  3. Las estructuras de datos que está consultando del lado del servidor (tablas de base de datos o lo que-usted) están sintonizadas para responder a esas solicitudes precisas lo más rápido posible
  4. Usted no está hacer solicitudes innecesarias (las solicitudes HTTP pueden ser costosas de configurar; quieres evitar disparar a cuatro de ellos cuando uno lo hará); probablemente también desee administrar un poco la histéresis (demorar la solicitud mientras las personas escriben, solo enviarla un par de segundos después de que se detengan y restablecer ese tiempo de espera si comienzan de nuevo)
  5. Usted está enviando tan poco información a través del cable que se puede usar razonablemente para hacer el trabajo
  6. Sus servidores están configurados para reutilizar conexiones (HTTP 1.1) en lugar de restablecerlos (este será el valor predeterminado en la mayoría de los casos)
  7. Está utilizando el tipo correcto de servidor; si un servidor tiene una gran cantidad de solicitudes de mantenimiento activo, debe estar diseñado para manejarlo correctamente (NodeJS está diseñado para esto, por ejemplo, Apache no lo es, en particular, aunque es por supuesto un extremadamente capaz servidor)
  8. puede almacenar en caché los resultados de las consultas comunes con el fin de evitar ir al almacén de datos subyacente innecesariamente
+0

@TJ: ¿puede explicar los puntos 6 y 8. Estoy construyendo sobre la base de una configuración LAMP simple y alojamiento básico. Entonces, necesito enfocarme en las sugerencias que puedo implementar como un "hombre pequeño". – StackOverflowNewbie

+0

Yo diría, en primer lugar, pregúntese: "¿tiene que ser una solicitud de AJAX o puedo cargar los datos en el cliente desde el principio y trabajar desde el lado del cliente?" – Matt

+0

@StackOverflowNewbie: Re 6, si está utilizando un servidor web moderno, no debería tener que hacer nada, ya debería estar configurado para permitir keep-alives. Re 8, se trata de utilizar un servidor web proxy en frente de uno "real" que almacena en caché el resultado de las consultas para poder reutilizarlas (nginx se puede configurar para hacer esto, por ejemplo), o usar servidor- tecnología de lado para mantener los resultados en la memoria por una duración (breve) (suponiendo que su servidor ya no está en la memoria, por supuesto). –

2

Necesitará un servidor web que pueda responder rápidamente, pero ese no suele ser el problema. También necesitará un servidor de base de datos que sea rápido y pueda consultar rápidamente qué resultados de búsqueda populares comienzan con 'ca'. Google no utiliza ninguna base de datos convencional para esto, pero usa grandes grupos de servidores, una base de datos similar al Cassandra, y la mayoría de esos datos se guardan en la memoria para un acceso más rápido.

No estoy seguro de si va a necesitar esto, porque probablemente pueda obtener resultados bastante buenos usando solo un servidor que ejecute PHP y MySQL, pero tendrá que tomar algunas buenas decisiones sobre la forma en que almacena y recupera la información. Usted no recibirá estos resultados rápidos si se ejecuta una consulta como esta:

select 
    q.search 
from 
    previousqueries q 
where 
    q.search LIKE 'ca%' 
group by 
    q.search 
order by 
    count(*) DESC 
limit 1 

Esto probablemente funcionará siempre y cuando menos de 20 personas han utilizado su búsqueda, pero probablemente se producirá un error en el que antes de llegar a una 100.000 .

+0

im usando java n mysql..how mi consulta debe be..for poniendo consulta rápida responses..the rightnow es como este selecto q.search de previousqueries q donde q.search COMO 'ca%' – Lucky

+0

Será mejor que lo preguntes en una nueva pregunta. Ahora estás comentando en una pregunta de 2 años. – GolezTrol

1

Puede comenzar haciendo un rápido motor de búsqueda para sus productos. Echa un vistazo a Lucene para buscar texto completo. Está disponible para PHP, Java y .NET, entre otros.

+0

Utilizará Solr. – StackOverflowNewbie

1

Esta enlaces explica cómo hicieron instant previews fast. Todo el sitio highscalability.com es un sitio muy informativo.

Además, debe almacenar todo en la memoria y debe evitar recuperar datos del disco (¡despacio!). ¡Redis, por ejemplo, es muy rápido!

Cuestiones relacionadas