2009-11-30 79 views
1

我有一个简单的消息队列设置并使用Zend_Queue对象启动运行。我正在使用Zend_Queue_Adapter_Db后端。我有兴趣将它用作工作队列,以便在以后处理事件时进行处理。他们是不需要立即发生的工作,但应该尽早而不是晚些发生。用于运行Zend队列接收器的基础架构

是否有最佳实践/标准方法来设置您的基础设施以运行作业?我了解从队列中接收消息的代码,但我不清楚的是如何运行接收的程序。在命令行上接收n条消息的cron,每分钟运行一次?一个启动多个Web请求的cron,每个Web请求都运行接收者脚本?还有别的吗?

切线奖励问题。如果我使用Zend_Db运行其他查询,那么消息队列查询是否会被视为该事务的一部分?

回答

2

你可以像线程池那样做。创建一个命令行php脚本来处理接收。它应该由一个shell脚本启动,该脚本在死亡时自动重启进程。如果shell脚本已经在运行,则该脚本不应该启动该进程(使用$ pid.running文件或类似文件)。每隔1-10分钟就有一次cron运行。这应该很好地处理接收。

我不会让cron触发Web请求,除非您的cron出于某种奇怪的原因在另一台服务器上。

另一种使用这种方式的方法是让一些后台进程创建数据,一个网页用户在浏览网站时自动使用它。报告生成器可能以这种方式工作。公司范围的报告可供所有用户使用,但您不希望他们全部生成此数据库/时间密集型报告。因此,您可以创建一个队列并逐个处理一个队列,以删除重复项。所有用户都可以在准备好后查看报告。

According to the docs它看起来并不像zend db甚至使用与其他zend_db查询相同的连接。但当然,找出最好的方法是做一个简单的测试。

EDIT cron中的多行代表并发性。每条线代表池的工作人员。我不清楚,你不想让pid作为标识符,你想通过它作为参数。

          • /home/byron/run_queue.sh处理1
          • /家庭/拜伦/ run_queue。SH过程2
          • /home/byron/run_queue.sh Process3

的bash脚本将检查为$ process.running文件,如果它发现它退出。

否则:

  • 创建$ process.running文件。
  • 启动php进程。阻止/等待直到完成。
  • 删除$ process.running文件。

这允许PHP脚本死亡,但不会导致池释放工人。

如果队列为空,php脚本会立即退出,并由cron的nex调用再次启动。

+0

后续问题; (道歉,如果这是天真的/明显的)。你是否建议我 1.编写一个PHP程序来接收消息; 2.编写一个shell脚本,查找由PHP脚本创建的$ pid.running文件? 3.如果未找到$ pid.running文件,请启动PHP脚本,然后退出?; 4.在crontab中有很多行用于启动shell脚本。其中一些将运行,查看$ pid.running文件并退出,但通过每分钟运行多次尝试,您可以确保定期运行/重新运行该程序; 我拥有它吗,还是我错过了什么? – 2009-11-30 21:59:07

+0

我也忘了,你也可以通过查看它的创建日期来设置正在运行的文件的超时时间。你需要让你的php脚本只处理x个条目并退出,这样你会知道最长的运行脚本会花多长时间采取。 – 2009-11-30 22:39:04

+0

啊哈,我以为我错过了什么。感谢您抽出宝贵的时间在我的新手细节中解释这一点! – 2009-12-01 02:00:04