寻找处理与web应用程序相关的长期运行操作的模式/方法/建议

时间:2008-10-24 21:37:00

标签: performance apache architecture web-applications lamp

我正在开发一个消费者网络应用程序,该应用程序需要执行与每个客户请求相关的长时间运行后台进程。通过长时间运行,我的意思是1到3分钟之间。

这是一个示例流程。对象/小部件并不重要。

  1. 客户访问该网站并指定他们正在寻找的对象/窗口小部件。
  2. 我们搜索/清理/过滤符合某些初始条件的小部件。 < - 长时间运行的流程
  3. 客户进一步配置有关他们正在寻找的小部件的更多细节。
  4. 当长时间运行的过程完成后,客户可以在转换前完成最后几个步骤。
  5. 步骤3和4并不重要。我只是提到它们,因为我们可以在长时间运行的过程中花一些时间。

    我们正在使用的环境是LAMP堆栈 - 目前正在使用PHP。在mod_php(或fastcgi进程)中使长时间运行的进程占用apache线程似乎不是一个好的设计。我们的应用的apache层应该专注于提供内容而不是数据处理IMO。

    几个问题:

    1. 我们的想法是否正确,我们应该将这个“长时间运行”的部分从apache / web应用层中分离出来?
    2. 是否有标准/典型的方法可以在Linux / Apache / MySQL / PHP下解决这个问题(如果合适,我们可以使用不同的语言进行处理)?
    3. 有关如何解决问题的任何建议?例如。我们是否创建了一个通过FIFO队列进行搅拌的守护进程?
    4. 编辑:只是为了澄清,只有大约1/4的长时间运行过程是以数据库为中心的。我们正在努力优化该部分。我们可能会做一些工作,但我们现在可以做的数量有限。

      谢谢!

6 个答案:

答案 0 :(得分:1)

考虑通过AJAX从Web服务而不是您的应用程序提供搜索结果。据推测,您可以将其卸载到另一台服务器,让Web应用程序根据需要处理内容。

好奇:1-3分钟对于查询查询似乎很长时间。您是否查看了要查询的列上的索引以提高速度?或者你需要做一些算法过程 - 也许你可以离线执行一些这样的过程,并用提示预先填充一些常见的搜索?

答案 1 :(得分:1)

正如Jonnii建议的那样,您可以启动子进程来执行后台处理。但是,这需要谨慎处理:

  • 确保传递的所有参数都已正确转义
  • 确保一次运行多个进程副本

如果进程的多个副本运行,那么就没有什么能阻止(甚至是恶意的,只是不耐烦的)用户在页面上重新加载它,最终启动了这么多副本,机器用完ram并研磨到停了下来。

因此,您可以使用子流程,但要以受控方式仔细地进行,并对其进行正确测试。

另一个选择是让守护进程永久运行等待请求,处理它们然后将结果记录到某个地方(可能在数据库中)

答案 2 :(得分:0)

这是穷人的解决方案:

exec ("/usr/bin/php long_running_process.php > /dev/null &");

或者你可以:

  1. 在数据库中插入一行,其中包含后台请求的详细信息,然后守护程序可以读取并处理。

  2. 将消息写入消息队列,然后读取并处理守护程序。

答案 3 :(得分:0)

以下是对此问题的Java版本的一些讨论。

请参阅java: what are the best techniques for communicating with a batch server

您可能会做的两件重要事情:

  1. 切换到Java并使用JMS。

  2. 阅读JMS但使用其他队列管理器。例如,Unix命名管道可能是可接受的实现。

答案 4 :(得分:0)

Java servlet可以background processing。您可以在具有线程支持的Web技术中执行与此技术类似的操作。我不知道PHP。

答案 5 :(得分:-1)

不是一个完整的答案,但我认为使用AJAX并将第二步传递给比PHP(C,C ++,C#)更快的东西,然后PHP函数从一些堆栈中选择结果,很可能只是一个数据库。