我有服務(wù)器A,服務(wù)器B,使用webman最新版,使用webman/redis-queue隊(duì)列,服務(wù)器B會發(fā)送隊(duì)列queue_request到服務(wù)器A,處理完成后,發(fā)送隊(duì)列queue_response等待服務(wù)器B接收。
"php": ">=7.2",
"workerman/webman-framework": "^1.5.0",
"monolog/monolog": "^2.0",
"tinywan/exception-handler": "^1.1",
"webman/think-orm": "^1.0",
"psr/container": "^2.0",
"illuminate/redis": "^10.5",
"symfony/cache": "^6.2",
"webman/console": "^1.2",
"topthink/think-log": "^2.0",
"workerman/crontab": "^1.0",
"zjkal/time-helper": "^1.1",
"tinywan/validate": "^0.0.6",
"ext-openssl": "*",
"yzh52521/webman-lock": "^1.0",
"ext-pdo": "*",
"yzh52521/webman-throttle": "^1.0",
"google/apiclient": "^2.13",
"symfony/translation": "^6.2",
"webman/redis-queue": "^1.2",
"vlucas/phpdotenv": "^5.5",
"webman/log": "^1.1",
服務(wù)器能正常運(yùn)行一段時間,有時候幾小時,有時候一兩天,然后就會發(fā)生錯誤,stdout.log打印錯誤如下。這個錯誤目前只會影響出現(xiàn)異常的隊(duì)列,其他進(jìn)程里面連接到服務(wù)器B使用support\Redis是不受影響的。
Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)
Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)
Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)
Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)
Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)
下圖是我的status信息,27388正常的時候,connections是有4個連接的。
發(fā)現(xiàn)報(bào)錯的隊(duì)列,然后跟綜進(jìn)程 strace -ttp 27388
對比下面這個是正常連接隊(duì)列的情況 strace -ttp 27389
27388隊(duì)列正常是要執(zhí)行BRPOP取出數(shù)據(jù),但是卻出現(xiàn)了循環(huán)報(bào)錯“NOAUTH Authentication required”,導(dǎo)致了連接失敗,從而報(bào)了“Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)”這個錯誤,理論上應(yīng)該是這樣的。
這個隊(duì)列,我開了兩個進(jìn)程,另外一個進(jìn)程是可以正常連接,為何其中一個進(jìn)程過一段時間就出錯,并且報(bào)需要認(rèn)證,難道因?yàn)榕渲梦募G失,如果丟失的話,那另外一個進(jìn)程同樣也會異常。
希望有大神能解我茅塞。
可能是消費(fèi)太耗時了,影響了redis異步連接。
消費(fèi)消息時需要投遞新消息到隊(duì)列里的時候用用同步投遞的方法 Resdis::send()
老大,我確定用的是同步,不是異步隊(duì)列。
我查了下“NOAUTH Authentication required”相關(guān)的資料如下圖:
在沒有使用密碼連接情況下,直接連接使用命令,就會報(bào)“NOAUTH Authentication required”。
當(dāng)他報(bào)“Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)”這個錯誤的時候,他不應(yīng)該重新連接嗎?但是從下面這個圖里面,他根本沒有嘗試去連接,而是直接快速的嘗試使用BRPOP這個命令。
下面是隊(duì)列配置文件,config/plugin/webman/redis-queue/redis.php,如果說報(bào)”NOAUTH Authentication required“,會不會跟我的配置文件里面使用了env()有關(guān)系。
<?php
return [
'default' => [
'host' => 'redis://'. env('REDIS_DEFAULT_HOST', '127.0.0.1') .':' . env('REDIS_DEFAULT_PORT', 6379),
'options' => [
'auth' => null, // 密碼,字符串類型,可選參數(shù)
'db' => 1, // 數(shù)據(jù)庫
'prefix' => 'queue:', // key 前綴
'max_attempts' => 5, // 消費(fèi)失敗后,重試次數(shù)
'retry_seconds' => 5, // 重試間隔,單位秒
]
],
'master' => [
'host' => 'redis://'. env('REDIS_MASTER_HOST') .':' . env('REDIS_MASTER_PORT'),
'options' => [
'auth' => env('REDIS_MASTER_PASSWORD'), // 密碼,字符串類型,可選參數(shù)
'db' => 1, // 數(shù)據(jù)庫
'prefix' => 'queue:', // key 前綴
'max_attempts' => 5, // 消費(fèi)失敗后,重試次數(shù)
'retry_seconds' => 5, // 重試間隔,單位秒
]
]
];
錯誤每隔5秒報(bào)錯“Workerman Redis Connection to redis://192.168.2.18:7550 timeout (5 seconds)”,說明有在重試,但是實(shí)際上并沒有進(jìn)行重試的操作,而只是一直在嘗試BRPOP出數(shù)據(jù)。
報(bào)錯的連接和BRPOP的應(yīng)該不是同一個連接,并且你的strace時間也沒有達(dá)到5秒。我這沒有你的現(xiàn)場環(huán)境,你自在源碼里定位下吧。