Мгновенный автокомплит для 240 миллионов доменных имён: p99 0 мс*
P99 0 ms* autocomplete for 240M domain names
Автор, создатель Wirewiki, объясняет, как добился практически нулевой задержки автокомплита для 240 миллионов доменных имён. Секрет — в предварительной выборке на стороне клиента и двухуровневой структуре данных: in-memory trie для популярных доменов и memory-mapped блочный индекс для остальных. Нагрузочное тестирование показало, что API отвечает за 2 мс даже при 1600 запросах в секунду. Остаётся одна проблема — географическая: для пользователей из США задержка превышает бюджет из-за расстояния до сервера в Европе.
p99 0 мс означает, что в 99% случаев результаты будут готовы раньше, чем пользователь отпустит клавишу.
- skybrian
Этот автокомплит предлагает домены, которых не существует. Можно просто ввести какую-нибудь ерунду, и он что-нибудь предложит, но если перейти по этому адресу, там не будет записей. Похоже, одна из целей поля автодополнения — помочь избежать опечаток, так что это делает его менее полезным.
- chrismorgan
Использовать keyup бессмысленно и противоречит ожиданиям пользователей. Для запуска действий (включая обычный ввод) следует использовать только keydown. (Ну, есть одно исключение, причины которого мне неясны: активация кнопки пробелом. Она срабатывает на keyup, как клики — на отпускание, в то время как Enter срабатывает на keydown.) Keyup ограничен ситуациями, когда вы постоянно реагируете на состояние клавиши, как это бывает в играх. Это влияет и на функциональность. Использование keyup вместо keydown на самом деле добавляет задержку. Ощущается плохо.
- ViscountPenguin
К сожалению, этот подход не так хорош здесь, в Австралии, — это явно функция задержки. Думаю, можно добиться гораздо большего, если рассматривать это как задачу оптимизации: использовать полный словарь алфавита, но добавить остаточное предсказание, которое стремится покрыть как можно большую часть оставшегося дерева доменных имён с учётом популярности. Это дерево можно было бы заранее подготовить и хранить в той же системе. Это, вероятно, дало бы p99 0 мс даже в Австралии.
- oersted
Почему бы просто не запускать запрос на keyDown и не показывать результат, как только придёт ответ, как обычно? Время нажатия клавиши — разумная цель для задержки API, я полагаю, но это всё же произвольная цель. Ожидание отображения до keyUp добавляет задержку, если ваш API быстрее. Синхронизация с keyUp не делает его более мгновенным для меня.
- kevmo314
Если вы хотите ещё больше снизить сетевую задержку, можно хранить каждый узел дерева как файл, называя его по префиксному пути к этому узлу. Затем выгрузить несколько сотен миллионов файлов на R2. Теперь обход можно полностью выполнять через CDN-запросы!