Высокопроизводительное приложение: как сохранить данные? Perl, Ajax, много запросов одновременно - PullRequest
2 голосов
/ 11 января 2011

просто очень короткий вопрос.

У меня есть веб-сайт, который подделывает ~ 4-16 запросов AJAX для одного запроса веб-сайта. Это мета-поиск. Я хочу регистрировать результаты этих запросов AJAX.

Какой лучший способ сделать это?

Некоторые, которые я имею в виду

  • а) дБ - не очень хорошо, потому что подключение к серверу занимает много времени
  • б) текстовый файл - возможно, на сервере выполняется несколько скриптов (например, если одновременно выполняется 16 процессов время) может повредить текстовый файл. Это можно собирать (), но достаточно?
  • в) текстовые файлы - один для каждый процесс perl. Однако это было бы создать 16 файлов на запрос, и если я иметь только 1000 запросов в день это все равно будет означать 16 тыс. файлов на день.

Есть идеи, что будет лучшим способом?

Краткое резюме: Ajax Request-> 16 Perl Script run-> Результаты этих сценариев должны быть сохранены

Ответы [ 3 ]

3 голосов
/ 11 января 2011

Если вы хотите высокопроизводительное приложение, хорошим способом является использование некоторой постоянной среды, такой как fastcgi. Таким образом, у вас будет мало процессов, работающих в ответ. При использовании базы данных это позволило бы оставить соединение открытым, что делает этот параметр довольно быстрым.

Для файловой опции вам потребуется блокировка. Я использую Log :: Log4perl с режимом блокировки следующим образом:

use Log::Log4perl qw(:easy);

Log::Log4perl->init(\ qq{
    log4perl.logger               = DEBUG, A1
    log4perl.appender.A1          = Log::Dispatch::File::Locked
    log4perl.appender.A1.filename = requests.log
    log4perl.appender.A1.mode     = append
    log4perl.appender.A1.close_after_write = 1
});

...
DEBUG "A message into log";
...

Уведомление Log::Dispatch::File::Locked и close_after_write опция установлена ​​в конфигурации.

1 голос
/ 11 января 2011

Поскольку вы сказали, что не можете использовать mod_perl и Apache, есть еще один вариант.

Создайте сервер для обработки сообщений журнала (вне вашего веб-сервера).

Затемкаждый из 16 сценариев Perl подключается к этому серверу (в идеале, к TCP-порту, который слушает сервер, но любая другая форма IPC может быть выполнима, если вы заботитесь о параллелизме).

Затем каждый сценарийкоторый должен регистрироваться, подключается к этому серверу регистрации (опять же, в идеале через порт TCP) и отправляет текст в журнал, и какой из 16 сценариев ведет запись (не требуется, если вы будете объединять журналы).

Таким образом, ваш сервер журналов просто создает единый журнал и делает все, что угодно (пишет в БД, пишет в один файл), при обслуживании каждого запроса.Учитывая ваши объемы, это должно быть достаточно быстро.

1 голос
/ 11 января 2011

Лучшим решением было бы mod_perl для Apache вместе с Apache :: DBI - что дает вам постоянные соединения с БД.

Если вы вынуждены использовать fastcgi, вы должны создать для себя «глобальный» $ dbh.

Log4Perl всегда является хорошим бэкэндом для ведения журналов (используйте его.) - но блокировка вам не понадобится, если вы открываете свой файл в режиме добавления, а не в двоичном режиме - за исключением того, что вам нужен строгий порядок. Буфер ввода-вывода будет записан в произвольном порядке, а не одновременно.

Использование блокировок заставит perl принудительно очищать свой буфер ввода-вывода при открытии / закрытии, и другой процесс, возможно, придется подождать - что может быть не очень хорошей идеей в отношении скорости (хотя и не знаю)

В обычных случаях вам нужны блокировки, только если вы что-то изменили в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...