Быстрый автокомплит с использованием libscgi

    Недавно была опубликована статья "libscgi — эффективное решение для простых и быстрых скриптов". Хотелось бы продолжить ранее представленую тему с более практической стороны. Как уже догадались из название — речь пойдет об скрипте автокомпита.

    Пользователей, и меня в частности, всегда разражали эти уж медленные автокомплиты. Бывает наберешь уже почти все слово, как появляется выпадающая менюшка. Понятно, что JavaScript сам по себе медленный. Но если еще автокомплит будет тормозить на стороне сервера, то вообще как-то кисло получается. Выход есть, если на серверной части использовать, что-то более быстрое, как вариант можно использовать бинарный скрипт с использованием libscgi. Исходники тут. Чуть ниже подробности.


    Описание Данных

    В данном примере скрипт осуществляет автокомплит по городам. Данные по всем городам записываются в файл формата csv. Данный файл (у меня 26 тыс строк) считывает в память и хранится в ввиде хеш-массива. ключом является приведенное к нижнему регистру название города или его псевдонима. В связи с переименованиями в Советское и пост Советское время, некоторые города имеют по несколько названий, например: Лениград, Питер, Санкт-Петербург. По этому — первая колонка — это приведенное имя или приведенный псевдоним города. Вторая колонка — официальное название города (первая буква большая). Треть колонка — это ранг города. Если мы выводим все города на буквы М, то для Пользователя предпочтительней, что бы Москва была раньше (первой в списке), нежеле Макеевка или Малиновка. Четвертый столбец — это id города по БД. Можно реализовать загрузку осуществить из БД напрямую, при загрузке демона автокомплита. Ранг нисходящий — наибольший приоритет имеет 1.

    Пример данных входного файла:
    "абатский","Абатский",2188,2188
    "абаша","Абаша",9711,9711
    "абашири","Абашири",21156,21156
    "абдулино","Абдулино",1424,1424

    Для запрос на поиск используется метод POST, тело которого составляет один-два-три и более поисковых символа. Запрос отправляется на предопределенный url http: // hostname/cityes Данный урл можно изменить, указав новый в исходниках.

    Так как автокомплит осуществляется по технологии AJAX, то в качестве выходного формата данных был выбран json. Выходной формат:
    {
    "cityes" : [
    { "name": "New York", "id":90},
    { "name": "New Vasyki", "id":808},
    { "name": "Nazareth", "id":1505},
    { "name": "Neaple", "id":1965}],
    "time":304
    }

    Ограничение на вывод — 10 пунктов меню. Приктика показала, что больше не надо. Но если хочется, то можно измененить DEFINE определение в исходниках: autocomplete.cpp

    необязательный параметр «time», реализован для контроля — время поиска в микросекундах. Реальное время незначительно больше, за счет обработки самим scgi сервером и nginx. Реально это где-то 0,5-0,7 мс (миллисекунд)

    Объем занимаемой памяти демона для 25 тыс строк данных — 600 К. Потребляемое CPY — практически 0%. Очень хорошо разгружает БД, если у нас автокомплит был ранее на БД (я использовал redis, но с внедрением libscgi — потихоньку от него отказываюсь). Пока все находится в режими тестирования, но работает красиво и быстро.

    Компиляция:

    make lib — компилится библиотека
    make ac компилится файл автокомплита

    Запуск

    ./server /path/to/cityes_file

    Предлагаем идеи, где еще можно использовать libscgi.
    Сделаем вместе Мир добрее и лучше!

    Средняя зарплата в IT

    113 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 5 444 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 11

      +6
      Пользователей, и меня в частности, всегда разражали эти уж медленные автокомплиты. Бывает наберешь уже почти все слово, как появляется выпадающая менюшка. Понятно, что JavaScript сам по себе медленный.

      Автокоплит тормозит не из-за ЖС, а из-за того, что ему зачастую на каждое нажатик клавиши надо устанавливать соединение с сервером.

      В вашем случае ускорение достигнуто только лишь из-за перемешения данных в память. И никак не из-за libscgi.
        0
        если сервер отвечает медленно, то и автокомплит будет тормозить
          0
          Серьезно?
        +1
        > Понятно, что JavaScript сам по себе медленный.

        Что это за интересное заявление? :)
          0
          Абсолютно бессмысленно менять redis на этот велосипед. И то и то хранит данные в памяти.

          В autocomplete важен latency от юзера до сайта. Если пинг большой — всё-равно будет тормозить.
            0
            Кстати, для варианта «выбор города», я бы делал префетч 10/50/100 наиболее популярных городов. Так, юзер сразу поймёт, что это автокомплит.
              0
              тут это и предусмотрино — существует рейтинг городов: вывод осуществляется в соответствии с рейтингом.
              0
              но, мы отдаем данные не напрямую из редиса, а через какой-то бэкенд. Если бэкенд будет тормозить, то…
                0
                что мешает сделать бакэнд на том же си? :)
                  0
                  чем твой вариант принципиально отличается от моего?
              0
              Фейсбук, кстати, для реализации «быстрого» автокомплита подсасывает на клиента список друзей и некоторые другие частонабираемые вещи, для ускорения процесса.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое