高性能应用程序:如何保存数据? Perl,Ajax,很多请求一次

时间:2011-01-11 09:15:59

标签: ajax perl performance

只是一个非常简短的问题。

我有一个网站,为一个网站请求伪造~4-16个AJAX请求。这是一个元搜索。我想记录这些AJAX请求的结果。

最好的方法是什么?

我想到的一些

  • a)db - 不太好,因为 与服务器的连接需要很多 时间
  • b)文本文件 - 可能是 多个脚本在服务器上运行 (例如,如果16个进程同时运行 可能会破坏文本文件。它 可以是flocked(),但就是这样 足够?
  • c)文本文件 - 一个用于 每个perl进程。不过那样会 每个请求创建16个文件,如果我 每天只有1000个请求 这仍然意味着每个16k文件 一天。

任何想法最好的方法是什么?

简短回顾: Ajax请求 - > 16 Perl脚本运行 - >应保存这些脚本的结果

3 个答案:

答案 0 :(得分:3)

如果你想要高性能的应用程序,好的方法是使用像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::Lockedclose_after_write选项。

答案 1 :(得分:1)

更好的解决方案是Apache和DB :: DBI的mod_perl - 为您提供持久的数据库连接。

如果你被迫使用fastcgi,你必须为自己创建一个$ dbh“global”。

Log4Perl总是一个很好的日志记录后端(使用它。) - 但只要你以追加模式而不是二进制模式打开你的文件就不需要锁 - 除了你需要一个严格的命令。 IO缓冲区将以随机顺序写入 - 而不是同时写入。

使用锁定将perl强制总是在打开/关闭时刷新其IO缓冲区,而另一个进程可能必须等待 - 速度可能不是一个好主意(不知道)

在正常情况下,如果您更改文件中的某些内容,则只需要锁定。

答案 2 :(得分:1)

既然你说你不能使用mod_perl和Apache,那还有另一个选择。

创建一个服务器来处理日志消息(在Web服务器之外)。

然后,将16个Perl脚本中的每一个连接到该服务器(理想情况下,在服务器侦听的TCP端口上,但如果您注意并发性,则可能是其他任何形式的IPC)。

然后,需要记录的每个脚本都连接到该日志记录服务器(理想情况下,在TCP端口上)并将文本发送到日志以及16个脚本中的哪个记录(如果要合并日志则不需要)

这样,您的日志服务器只需创建统一日志,并在为每个请求提供服务时执行任何操作(写入DB,写入单个文件)。鉴于你的数量,它应该足够快。