Ajax запросы/ответы: как сделать их молниеносно?

Я наткнулся на сайт, который делает что-то очень похожее на Google Suggest. Когда вы вводите 2 символа в поле поиска (например, "ca", если вы ищете продукты "canon" ), он выполняет 4 запроса Ajax. Кажется, что каждый запрос выполняется менее чем за 125 мс. Я случайно заметил, что Google Suggest занимает 500 мс или более.

В обоих случаях оба сайта бывают быстрыми. Каковы общие концепции/стратегии, которым следует следовать, чтобы получать сверхбыстрые запросы/ответы? Спасибо.

РЕДАКТИРОВАТЬ 1: кстати, я планирую реализовать функцию автозаполнения для поиска сайта электронной коммерции, где он 1.) предоставляет предложение поиска на основе того, что набирается, и 2.) список возможных совпадений продуктов на основе что было напечатано до сих пор. Я пытаюсь найти что-то похожее на поиск SLI Systems (например, http://www.bedbathstore.com/).

Ответ 1

Это немного вопрос о том, "длинный вопрос", и поэтому я делаю это сообществом wiki answer — каждый может свободно в нее вскочить.

Я бы сказал, что это важно, чтобы:

  • Сервер/серверная ферма/облако, которые вы запрашиваете, правильно настроена в соответствии с нагрузкой, которую вы бросаете на нее, и/или может изменять размер в соответствии с этой загрузкой.
  • Сервер/серверная ферма/облако привязаны к хорошей быстродействующей магистрали сети
  • Структуры данных, которые вы запрашиваете на стороне сервера (таблицы базы данных или что-то есть) настроены так, чтобы реагировать на эти точные запросы как можно быстрее
  • Вы не делаете ненужных запросов (HTTP-запросы могут быть дорогими для настройки, вы хотите избежать выключения четырех из них, когда вы это сделаете); вы, вероятно, также захотите немного вставить управление гистерезисами (задержка запроса во время набора текста, только отправка его через пару секунд после их остановки и сброс этого таймаута, если они начнутся снова).
  • Вы отправляете как можно меньше информации по кабелю, как это можно разумно использовать для выполнения задания.
  • Серверы настроены на повторное использование соединений (HTTP 1.1), а не на их восстановление (это будет по умолчанию в большинстве случаев)
  • Вы используете правильный сервер; если сервер имеет большое количество запросов keep-alive, он должен быть разработан таким образом, чтобы обрабатывать это изящно (NodeJS предназначен для этого, в качестве примера: Apache не является, в частности, хотя он, конечно, чрезвычайно способным сервером)
  • Вы можете кэшировать результаты для общих запросов, чтобы избежать ненужного обращения к базовому хранилищу данных.

Ответ 2

Вам понадобится веб-сервер, способный быстро реагировать, но обычно это не проблема. Вам также понадобится сервер базы данных, который быстр и может запросить очень быстро, какие популярные результаты поиска начинаются с "ca". Google не использует обычную базу данных для этого вообще, но использует большие кластеры серверов, Cassandra-like базу данных, и большую часть эти данные хранятся в памяти, а также для более быстрого доступа.

Я не уверен, что вам это понадобится, потому что вы, вероятно, можете получить довольно хорошие результаты, используя только один сервер, на котором запущены PHP и MySQL, но вам нужно будет сделать правильный выбор о том, как вы храните и извлекаете Информация. Вы не получите эти быстрые результаты, если вы выполните такой запрос:

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

Это, вероятно, будет работать до тех пор, пока менее 20 человек будут использовать ваш поиск, но, скорее всего, вам не удастся, прежде чем вы достигнете 100 000.

Ответ 3

Вы можете начать с быстрой поисковой системы для своих продуктов. Проверьте Lucene для полнотекстового поиска. Он доступен для PHP, Java и .NET среди других.

Ответ 4

В этих ссылках объясняется, как быстро мгновенные предварительные просмотры. Весь сайт highscalability.com - очень информативный сайт.

Кроме того, вы должны хранить все в памяти и не должны извлекать данные с диска (медленно!). Например, Redis молниеносно!