您的位置:首页 > 编程语言 > PHP开发

好久没更新了,推出beanstalkd php后台队列系统利器

2015-01-14 16:04 495 查看
开头语:

    最近使用了phalcon的php c语言编写的框架,在我们项目组由我推进了这个框架的使用,现在基本初步阅读了下c源码,同时将phalcon-php-framework-documentation.pdf 熟读于胸,di router mvc view cache model phql assets等组件已经使用的比较好,前面已经写了篇blog介绍js压缩和css压缩的方法,就是灵活使用了assets管理组件。

主题:

    今天向大家推荐beanstalkd的队列系统,它其实就是一个简单的队列系统,这里我们主要期望利用它来解决一些长时间的任务处理。

举例场景:

     比如用户重置密码功能的时候 点击发送重置密码邮件,或者点击 生成报告 这样的 长时间处理的功能。界面不应该将它停留在请求中,而是直接将任务插入队列系统,然后就可以返回给用户,告诉他请稍候收取邮件或者没收到,再发一份。或者生成报告时候 插入队列后返回界面,然后轮询报告生成进度 这类的友好处理。

思想来源:

    Do blocking work in the background

    Process a video, send e-mails, compress a file or an image, etc., are slow tasks that must be processed in background jobs. There are a variety of tools that provide queuing or messaging systems that work well with PHP  • Beanstalkd   • Redis    • RabbitMQ   
• Resque    • Gearman    • ZeroMQ

设计思路:

      组件1:安装beanstalkd,它其实就是一个监听服务,默认11300端口。

      class Queue extends BeansTalk{

          public function __construct()

         {

             parent::__construct(array(

                'host' => 'localhost',

                'port' => '11300'));

          }

        }

        然后就使用单例模式创建该queue,就可以使用putqueue插入队列,然后后台起一个轮询的任务workerfactory

       while ($queue->peekReady() !== false) {

            $job = $queue->reserve();

            echo "report begin\n";

            $message = (object)$job->getBody();

            $Factory = new WorkFactory();

            $reportWorker = $Factory->create($message->type);

            $reportWorker->doWork($message->params);

            echo "\nreport end\n";

        }

           该部分使用了cli模式的phalcon框架  php  /var/www/html/apps/cli/cli.php work main 即可调用workerfactory分发任务

       组件2:daemontools

           daemontools is a collection of tools for managing UNIX services.supervise monitors a service.It starts the service and restarts the service if it dies.

         写了个shell循环调用 guiwork

          #!/bin/sh

          while true

          do

                     sh /var/www/html/apps/scripts/reportworker.sh 1>/dev/null 2>&1 &

                    sleep 60;

            done

          reportworker.sh 调用php  /var/www/html/apps/cli/cli.php work main

           daemontools supervise监控 guiwork 

总结:

     基本上就是后台一分钟循环执行一次shell 执行调用php 查询queue取任务,然后执行。

在任务完成时间较长的情况下,加入A任务一分钟还没完成,下一个一分钟会另外又有起个worker取到queue里面的新的job B ,

从而逐渐增加worker 加速处理 直到任务完成的 设计,这样一方面不会 起太多的进程,另一方面也不会在大量任务插入后处理不了的任务积累。

展望:

     进一步 beanstalkd支持分布式处理,现阶段,我们还是在一台服务器上执行,等真正用户量上来后,也方便扩展,将报告的worker直接扔到report专门的处理系统
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: