webman version = 1.2.7
workerman version = 4.0.30
PHP version = 7.4.26
描述:
1.
其他应用调用 webman 控制器接口,比如 /api/customer/register
2.
控制器接口中,类似于这样
$taskConnection = new AsyncTcpConnection('Text://127.0.0.1:' . self::$taskPort);
// 发送数据
$taskConnection->send(json_encode($taskData));
//如果需要结果
// $taskConnection->onMessage = function (AsyncTcpConnection $taskConnection, $task_result) {
// // 结果
// var_dump($task_result);
//
// // 获得结果后记得关闭异步连接
// $taskConnection->close();
//
// // 通知对应的websocket客户端任务完成
//// $ws_connection->send('task complete');
// };
$taskConnection->connect();
3.
开启N个task进程,监听对应的地址
task进程中,在 onMessage
中处理任务,处理完任务后,会 close connection
疑问:
1.
webman,每接受到一个请求,在这个接口中,就new 一个AsyncTcpConnection,如果请求量非常大,会有什么隐患或者影响吗?
2.
如果请求量很大,task进程消费不过来了,请求是不是会在task进程中排队
比如,开了5个task进程,有10个请求进来了,每个task处理请求需要5秒,第6个请求,是不是会在task进程中排队等候被处理?
3.
如果请求量很大,会不会造成任务丢失的情况?
比如,链接断开了,当前这个任务就不在了
4.
如何防止任务丢失的情况
如何做补偿性的处理?
给一个思路也可以
目前在做使用这个异步任务,担心任务丢弃了,就找不到了
对健壮性要求高的异步任务建议使用正儿八经的消息队列
好的,谢谢
再插一句,要RabbitMQ这种正儿八经的
用RabbitMQ,会增加项目复杂度吗,redis,项目本身用来做缓存的,所以想着直接用redis做队列
目前是这样的
通过task进程执行异步任务,如果在task进程处理异步任务时,失败了,在catch中,又再push到队列中,再消费处理一次
不知道这样的思路,是否可行
主要是redis无法确保3和4
1、如果服务器负载过高,或者ESTABLISHED连接消耗光本地端口,都可能会连接失败。
2、会排队
3、连接断开可能会导致数据丢失
4、直接用消息队列