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

开头语:

    最近使用了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专门的处理系统


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值