1

我有一个简单的消息队列设置并使用Zend_Queue对象层次结构运行。我正在使用Zend_Queue_Adapter_Db后端。我有兴趣将其用作作业队列,以安排稍后处理的事情。它们是不需要立即发生的工作,但应该尽快发生而不是迟到。

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

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

4

1 回答 1

2

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

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

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

根据文档,它看起来不像 zend db 甚至使用与其他 zend_db 查询相同的连接。但当然最好的方法是做一个简单的测试。

编辑 cron 中的多行用于并发。每条线代表池的一个工人。我不清楚,你不希望 pid 作为标识符,你想将它作为参数传递。

          • /home/byron/run_queue.sh 进程1
          • /home/byron/run_queue.sh Process2
          • /home/byron/run_queue.sh 进程3

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

否则:

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

这允许 php 脚本终止,但不会导致池失去工作人员。

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

于 2009-11-30T18:39:06.433 回答