我搭建了一臺channel服務(wù)器 IP 192.168.27.24
通過192.168.27.18、192.168.27.19等兩臺服務(wù)器共64個進(jìn)程連接到channel服務(wù)器
A程序發(fā)送消息可以成功
但是B程序發(fā)送的數(shù)據(jù)我發(fā)現(xiàn)TCP任務(wù)服務(wù)器接收不到任務(wù)數(shù)據(jù),通過抓取發(fā)布(publish)數(shù)據(jù)的內(nèi)容
發(fā)現(xiàn)tcp報(bào)文長度非常的短,發(fā)送幫看看這個是什么原因
----------------------------------------------GLOBAL STATUS----------------------------------------------------
Workerman version:4.0.30 PHP version:7.3.22
start time:2022-03-25 01:17:15 run 85 days 10 hours
load average: 0, 0.01, 0.05 event-loop:\Workerman\Events\Event
1 workers 1 processes
worker_name exit_status exit_count
ChannelServer 0 0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory listening worker_name connections send_fail timers total_request qps status
14576 4M frame://0.0.0.0:12206 ChannelServer 64 0 0 13118754 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 4M - - 64 0 0 13118754 0 [Summary]
----------------------------------------- WORKERMAN -----------------------------------------
Workerman version:4.0.30 PHP version:7.3.22
------------------------------------------ WORKERS ------------------------------------------
proto user worker listen processes status
tcp www mq_heartbeat_server none 4 [OK]
---------------------------------------------------------------------------------------------
Input "php start_mq_heartbeat.php stop" to stop. Start success.
Channel客戶端程序
短報(bào)文猜測是心跳數(shù)據(jù)。
另外兩個抓包截圖都是192.168.27.19的通訊,并沒有 192.168.27.18 的抓包,所以 192.168.27.18 這臺可能沒有連上 channel服務(wù)器 IP 192.168.27.24 ?
我只抓了192.168.27.19的數(shù)據(jù),如果這個是心跳數(shù)據(jù),那就說明我的內(nèi)容發(fā)布很可能沒有成功,我再查一下。
各位,我初步找到原因了
我研究了channel的底層代碼,發(fā)現(xiàn)是通過async方式異步執(zhí)行publish的,由于我的工作內(nèi)容是寫在rabbitmq的回調(diào)里面,而由于rabbitmq客戶端做了while(true)循環(huán),導(dǎo)致沒有機(jī)會執(zhí)行異步任務(wù)。
把rabbitmq消費(fèi)者客戶端改成Timer執(zhí)行就好了
//按照每個進(jìn)程每秒處理1萬條來設(shè)定定時器
Timer::add( 0.0001 , function() {
global $rabbit_channel;
if( count($rabbit_channel->callbacks) > 0 ){
$rabbit_channel->wait();
}
});