我搭建了一台channel服务器 IP 192.168.27.24
通过192.168.27.18、192.168.27.19等两台服务器共64个进程连接到channel服务器
A程序发送消息可以成功
但是B程序发送的数据我发现TCP任务服务器接收不到任务数据,通过抓取发布(publish)数据的内容
发现tcp报文长度非常的短,发送帮看看这个是什么原因
----------------------------------------------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客户端程序
短报文猜测是心跳数据。
另外两个抓包截图都是192.168.27.19的通讯,并没有 192.168.27.18 的抓包,所以 192.168.27.18 这台可能没有连上 channel服务器 IP 192.168.27.24 ?
我只抓了192.168.27.19的数据,如果这个是心跳数据,那就说明我的内容发布很可能没有成功,我再查一下。
各位,我初步找到原因了
我研究了channel的底层代码,发现是通过async方式异步执行publish的,由于我的工作内容是写在rabbitmq的回调里面,而由于rabbitmq客户端做了while(true)循环,导致没有机会执行异步任务。
把rabbitmq消费者客户端改成Timer执行就好了
//按照每个进程每秒处理1万条来设定定时器
Timer::add( 0.0001 , function() {
global $rabbit_channel;
if( count($rabbit_channel->callbacks) > 0 ){
$rabbit_channel->wait();
}
});