Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

queue:work 经常过一段时间不再处理队列是什么原因? #114

Closed
17596902373 opened this issue Jul 2, 2020 · 11 comments
Closed

Comments

@17596902373
Copy link

使用 supervisor 管理队列处理进程: php think queue:work --queue order--daemon --tries 10由于项目不断会有新的任务进入队列,所以希望队列是保持一直运行。但是过一段时间,查看进程 ps -aux | grep 'order' 仍然能看到进程在运行,但是已经不处理队列了,需要php think queue:restart 重启任务才行,这是什么原因造成的呢,是 supervisor 的问题还是队列处理的问题?
// 这个消息发送入口
public function queue()
{
$res = Queue::push('app\index\controller\Login@fire', '28456049@qq.com', $queue = 'order');

   return api_success_ret($res);
}

// 这个是消息接收入口
public function fire(Job $job, $data)
{

    $isJobDone = $this->send($data);
    if ($isJobDone) {
        //成功删除任务
        $job->delete();
    } else {
        //任务轮询4次后删除
        if ($job->attempts() > 3) {
            // 第1种处理方式:重新发布任务,该任务延迟10秒后再执行
            //$job->release(10);
            // 第2种处理方式:原任务的基础上1分钟执行一次并增加尝试次数
            //$job->failed();
            // 第3种处理方式:删除任务
            $job->delete();
        }
    }
}

// 这个是消息处理
private function send($data)
{

    $result =  Db::name('dome')->insert([
        'times' =>date("Y-m-d H:i:s",time()),
        'name' =>$data
    ]);
    if ($result) {
        return true;
    } else {
        return false;
    }
}
@sciqtw
Copy link

sciqtw commented Jul 9, 2020

同样问题

@cnbattle
Copy link

同样情况,还以为自己代码的问题...

@itpang
Copy link

itpang commented Sep 4, 2020

同意问题+1

@DongDavid
Copy link

是不是长时间无任务,导致数据库链接断开,而数据库没有设置断线重连啊

@cnbattle
Copy link

cnbattle commented Sep 5, 2020

@DongDavid 推测并不是, 我是使用Redis驱动出现的,换成mysql之后,到目前为止都没有问题

@yunwuxin
Copy link
Member

yunwuxin commented Sep 5, 2020

最好使用php think queue:listen 别用php think queue:work work里的连接断了 是不会重连的,redis的连接也会断的

@DongDavid
Copy link

@cnbattle 我指的是你的业务代码中的Db链接断开了。

$result =  Db::name('dome')->insert([
        'times' =>date("Y-m-d H:i:s",time()),
        'name' =>$data
]);

php queue队列, 使用redis进行驱动, 但是在具体的任务执行过程中,我看你的代码使用连接了mysql数据库的。

而如果使用了work来运行队列, 则会在一个单一进程中重复执行这个Job, 且使用的是同一个Db连接, 那么当你长时间没有添加新的任务时,这个Db连接就会自动被断开, 导致后续新添加的任务执行的时候因为数据库连接失败而执行失败。

@DongDavid
Copy link

之前我碰到过这个错误, 不过我在日志中找到了它, 所以我把database.php里面的断线重连break_reconnect打开后, 就不再出错了。

@DongDavid
Copy link

@cnbattle 。 你把queue的驱动换成了mysql 0.0 。
那么我的理解是, 因为队列会不停的去轮询Db中的任务表, 所以你的这个work进程中的mysql连接会一致保持活跃状态,而不会因为长时间没有任务执行而被自动断开。
不知道对不对。

或许你可以试试, queue的mysql驱动连接一个数据库, 而业务数据连接另一个数据库, 两者使用不同的mysql连接, 那么长时间没有任务的情况下, 业务数据库的连接应该会被自动断开的。

@hjb0924
Copy link

hjb0924 commented Dec 4, 2020

楼主解决了没,同样 redis + supervisor ,第二天work 不执行了,进程还在!

@yunwuxin
Copy link
Member

yunwuxin commented Jan 26, 2021

一般都是redis连接断了,redis的连接断开后 程序是继续运行的 会调用ExceptionHandler的report方法报警

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants