【发布时间】:2021-06-23 00:41:42
【问题描述】:
我有一个实现 rabbitmq 消费者 (bschmitt/laravel-amqp) 的 php 应用程序 (laravel 5.8)。
当应用程序启动时,为了控制消费者进程,也会启动一个主管进程。
我的主管配置文件:
[program:message-consume]
process_name=%(program_name)s_%(process_num)02d
command=php artisan message:consume
directory=/var/www
autostart=true
autorestart=true
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/storage/logs/supervisor.log
stopwaitsecs=3600
startretries=20
消费命令
public function consume($routingKey)
{
Log::info("[MessagingService][consume] start consuming key: " . $ROUTING_KEY . ".*");
Amqp::consume($QUEUE_NAME, function ($message, $resolver) {
# my code...
$resolver->acknowledge($message);
}, [
'routing' => $ROUTING_KEY . '.*',
'queue' => $QUEUE_NAME,
'exchange' => $EXCHANGE,
'exchange_type' => 'topic',
'exchange_durable' => false,
'queue_force_declare' => true,
'queue_exclusive' => false,
'persistent' => true, // set true if consume forever
]);
}
一切似乎都很好,但我意识到,如果有一段时间没有消息,应用程序就会停止接收消息!
进程仍在运行,主管没有做任何事情。
这是怎么回事?我从 rabbit 仪表板可以看到,没有消费者连接到该频道。
这个想法是创建一个 cron 脚本,每分钟调用一次 rabbitmq api 来检查队列中是否有消费者,以防万一,重新启动主管。
我正在使用 docker,所以我更改了我的 startup.sh 以添加 cron
#!/bin/bash
supervisord
crontab /etc/cron.d/check-consumer-cron
cron -f
php-fpm
但我开始问我问题。我过得好吗?我错过了什么吗?我需要主管吗?
如果我按以下方式更改startup.sh,会发生什么变化?
#!/bin/bash
php artisan message:consume
crontab /etc/cron.d/check-consumer-cron
cron -f
php-fpm
【问题讨论】:
-
我不知道您是自己实现了消费者端还是使用了包。但是如果有第三方包的话,我建议你按照RabbitMQ文档实现consumer端再试试。
-
感谢@TohidDadashnezhad 的回答。您看到我在实施中遗漏了一些东西......可能是......我将在问题中添加信息。
-
我不确定,但我认为将 `'exchange_durable' => false` 更改为
true可能会解决此问题。
标签: laravel cron rabbitmq supervisord