Какой лучший способ реализовать веб-сервис для автозаполнения ajax - PullRequest
2 голосов
/ 22 июня 2009

Я использую функцию автозаполнения в Google Suggest для поиска по тегам с помощью автозаполнения jQuery.

Мне нужно предоставить веб-сервис jQuery, предоставив ему список предложений на основе того, что набрал пользователь. Я вижу 2 способа реализации веб-сервиса:

1) просто сохраните все теги в базе данных и выполните поиск в базе данных, используя пользовательский ввод в качестве префикса. Это просто, но я беспокоюсь о задержке.

2) Используйте внутрипроцессное дерево для хранения всех тегов и поиска по ним соответствующих результатов. Поскольку все будет в процессе, я ожидаю, что это будет иметь намного меньшую задержку. Но есть несколько трудностей: -Какой хороший способ инициализировать три при запуске процесса? Предположительно, я буду хранить данные тегов в БД, извлекать их и превращать в три, когда начну процесс. Но я не уверен как. Я использую Python / Django. -Когда новый тег создается пользователем, мне нужно вставить новый тег в дерево. Но скажем, у меня 5 процессов Django и, следовательно, 5 попыток, как мне сказать другим 4 попыткам, что им тоже нужно вставить новый тег? -Как убедиться, что этот файл является потокобезопасным, поскольку мои процессы Django будут потоковыми (я использую mod_wsgi). Или мне не нужно беспокоиться о threadsaty из-за GIL Python? -Каким образом, я могу также хранить частоту использования тега внутри файла? Как узнать, когда заканчивается строка тега и когда начинается частота - например, если я храню apple213 в три, это «яблоко» с частотой 213 или это «apple2» с частотой 13 ??

Любая помощь по вышеуказанным вопросам или любые предложения по другому подходу будут очень благодарны.

Ответы [ 2 ]

4 голосов
/ 22 июня 2009

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

Do всегда беспокоятся о многопоточности - GIL не заставляет условия гонки исчезать (управление может переключаться между потоками на любой границе инструкции псевдокода, а также когда код C находится в базовом расширении или встроенный выполняется). Сначала вам нужно проверить атрибут threadsafety используемого вами модуля API БД (см. PEP 249 ), а затем использовать блокировку или , чтобы порождать небольшой пул выделенных потоков. которые выполняют взаимодействия с БД (получение запросов в Queue.Queue и возвращение результатов в другом, обычная архитектура для звука и легкого создания потоков в Python).

1 голос
/ 22 июня 2009

Я бы использовал первый вариант. «ПОЦЕЛУЙ» - (Делай это просто глупо).

Для небольших объемов данных не должно быть большой задержки. Мы выполняем аналогичные действия для поиска по имени, и результаты появляются довольно быстро в нескольких тысячах строк.

Надеюсь, это поможет,

Josh

...