请教,关于 webman,使用异步任务的问题

evilk

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.
如何防止任务丢失的情况
如何做补偿性的处理?
给一个思路也可以
目前在做使用这个异步任务,担心任务丢弃了,就找不到了

2100 2 0
2个回答

nitron

对健壮性要求高的异步任务建议使用正儿八经的消息队列

  • evilk 2022-03-23

    好的,谢谢

  • nitron 2022-03-23

    再插一句,要RabbitMQ这种正儿八经的

  • evilk 2022-03-23

    用RabbitMQ,会增加项目复杂度吗,redis,项目本身用来做缓存的,所以想着直接用redis做队列
    目前是这样的
    通过task进程执行异步任务,如果在task进程处理异步任务时,失败了,在catch中,又再push到队列中,再消费处理一次
    不知道这样的思路,是否可行

  • nitron 2022-03-23

    主要是redis无法确保3和4

walkor 打赏

1、如果服务器负载过高,或者ESTABLISHED连接消耗光本地端口,都可能会连接失败。
2、会排队
3、连接断开可能会导致数据丢失
4、直接用消息队列

  • 暂无评论
年代过于久远,无法发表回答
×
🔝