消息队列feed程序实现中的问题

因项目须要, 构建了不少消息队列还排队处理任务, 相应的每一个队列也配有一个feed程序来feed消息this

一开始很简单地这样作:spa

        while (true){
            $msg = $query->bPop();
            //消息处理程序
        }

这种方式下feed程序一开始运行就永远不会退出,  乍看没有问题, 但存在一个问题, 一旦消息处理程序发生变化, 若是不手动kill进程后重启进程, 改动就不会被加载.code

另: 听说PHP进程运行太久就会产生垃圾难以回收, 须要终止进程来回收进程垃圾.blog

因此我讲feed程序都改为如下方式:生命周期

        set_time_limit ( 0 );
        $startTime = time ();
        $maxDealNum = 1000; // 最大处理次数
        $maxLifeTime = 12 * 3600; // 最大生命周期时长
        $dealedNum = 0;
        while ( true ) {
            $this->load->model ( 'item/category_frequently' )->bDealMsg ();
            $dealedNum ++;
            //超过最大处理次数或处理时长时程序退出, 以守护进程从新启动的方式清理内存垃圾
            if ($dealedNum > $maxDealNum || (time () - $startTime) > $maxLifeTime) {
                return;
            }
        }

每处理完一个消息后计数, 以及记录feed程序开始执行时间, 若是2者都超过某一个阙值就让程序退出, 这样能够避免单一的长时间饥饿或执行频繁情景下进程不会退出. 而消息处理程序发生改变的时候也能够在可预期时间内被从新加载队列

相关文章
相关标签/搜索