项目发版执行 php start.php reload 重启服务时,如果 redis 消费者进程正在处理消息,会导致这些消息丢失。
请问各位大佬,在不改 webman/redis-queue 插件源码的情况下,有办法解决这个问题吗?还是说只能换专业的 MQTT 服务了?
<?php
namespace app\queue\redis;
use support\Log;
use Webman\RedisQueue\Consumer;
class TestConsume implements Consumer
{
public $queue = 'test-consume';
public $connection = 'default';
public function consume($data)
{
Log::info('@@@@@@@start');
for ($i = 0;$i < 10;$i++) {
sleep(1);
}
Log::info('@@@@@@@end');
}
}
Redis::send('test-consume', []);
tail -f runtime/logs/webman-2025-01-09.log
#输出
[2025-01-09 09:54:33] default.INFO: @@@@@@@start [] []
php start.php reload
Linux CentOS 7
PHP 8.2.22
Webman-framework v1.5.24
webman/redis-queue v1.3.2
Redis Version: 7.0.11
文档不是有吗 配置进程退出的等待时间
感谢您的回复。尽管这并不能完全解决消息丢失的问题,但只要将退出等待时间设置得足够长,还是可以在很大程度上避免出现这个问题的。
对消息丢失有强要求就使用正儿八经的消息队列
webman插件:
rabbitmq https://www.workerman.net/plugin/67
redis-stream https://www.workerman.net/plugin/69
workerman组件:
rabbitmq https://www.workerman.net/doc/workerman/components/workerman-rabbitmq.html
mqtt https://www.workerman.net/doc/workerman/components/workerman-mqtt.html
以上都支持ack机制,防止丢失数据
说得对啊 ack机制得有
也可以单独开一个消费队列出来,不同于你的api项目上。这样频繁更新代码,不影响你消费者服务
我都是另外开一个队列work实例服务来执行的
你是基于 workerman/redis-queue 组件,自定义了一个命令创建 work 实例并订阅消费 redis 队列消息么
他意思是,再开一个完整的项目只进行消费吧
对的,另外开了一个项目只进行消费业务
那同一个项目不得维护两套相同的代码,除非消费者程序没有引用 API 项目的功能模块
怎么能用2套相同代码。 你单独处理队列任务就可以了吧。。
以前我们用workerman做游戏时候。4套代码。。都不一样,任务也不一样。 如果非要一样的话。 那顶多重啊?