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 молниеносно!