項(xiàng)目發(fā)版執(zhí)行 php start.php reload 重啟服務(wù)時(shí),如果 redis 消費(fèi)者進(jìn)程正在處理消息,會(huì)導(dǎo)致這些消息丟失。
請問各位大佬,在不改 webman/redis-queue 插件源碼的情況下,有辦法解決這個(gè)問題嗎?還是說只能換專業(yè)的 MQTT 服務(wù)了?
<?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 http://wtbis.cn/plugin/67
redis-stream http://wtbis.cn/plugin/69
workerman組件:
rabbitmq http://wtbis.cn/doc/workerman/components/workerman-rabbitmq.html
mqtt http://wtbis.cn/doc/workerman/components/workerman-mqtt.html
以上都支持ack機(jī)制,防止丟失數(shù)據(jù)
也可以單獨(dú)開一個(gè)消費(fèi)隊(duì)列出來,不同于你的api項(xiàng)目上。這樣頻繁更新代碼,不影響你消費(fèi)者服務(wù)
我都是另外開一個(gè)隊(duì)列work實(shí)例服務(wù)來執(zhí)行的
你是基于 workerman/redis-queue 組件,自定義了一個(gè)命令創(chuàng)建 work 實(shí)例并訂閱消費(fèi) redis 隊(duì)列消息么
怎么能用2套相同代碼。 你單獨(dú)處理隊(duì)列任務(wù)就可以了吧。。
以前我們用workerman做游戲時(shí)候。4套代碼。。都不一樣,任務(wù)也不一樣。 如果非要一樣的話。 那頂多重啊?