zoukankan      html  css  js  c++  java
  • 消息队列feed程序实现中的问题

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

    一开始很简单地这样做:

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

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

    另: 据说PHP进程运行过久就会产生垃圾难以回收, 需要终止进程来回收进程垃圾.

    所以我讲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者都超过某一个阙值就让程序退出, 这样可以避免单一的长时间饥饿或执行频繁情景下进程不会退出. 而消息处理程序发生改变的时候也可以在可预期时间内被重新加载

  • 相关阅读:
    克罗内克符号
    子进程和线程
    力扣:数学问题
    iconv装换文件编码格式
    mac 上iterm终端显示中文为乱码解决方案
    Android启动时间测试方法
    Centos4.3安装MySQL-python-1.2.3,出现error: command 'gcc' failed with exit status 1
    java mail发送邮件
    Java通过socket实现smtp协议发送邮件
    vim解决中文显示乱码问题
  • 原文地址:https://www.cnblogs.com/Moon-Face/p/4977845.html
Copyright © 2011-2022 走看看