关于 Channel Workerman 的 count 问题

Nucreon

Workerman 我到现在已经使用?🤨 (学习)了一年多左右,
但是到现在还困惑在这些通信机制和进程(因为长时间泡在 PHP-FPM+NGINX里不太懂其他)

问题 01 ✨ count 进程数为10的跟1的比起来更快?

按我理解的方式来说明的话
假设我们有两个服务,业务都是更新数据库

workerA 为 count = 10
workerB 为 count = 1

从某个地方同时请求 10个的话

worker A 因为是 10个 所以 把十个分配到每个进程
那么所花的总时间是 处理10个当中最长的

worker B 因为是 1个 所以 把十个一个一个接收并更新
所以花的总时间为 全部处理完后的时间?

问题 02 ✨ Channel 虽然底层是 workerman 但是不是有很大差别?

因为我之前跑的程序当中是 ServerA 监听 websocket 数据并发送到 ServerB 的场景


ServerA 只是 默认的worker ,没有配置端口(count 为 1)

ServerB 配置了端口和 http协议 并设置 count 为 10


爬虫业务部分是:如果 在监听中 type 为指定的 value 的话
ServerA 把数据发送给 ServerBServerB接收后会插入或更新数据库


  • ServerA 发送时,会 AsyncTcpConnection 来连接 ServerB

  • 发送数据 $conn->send($data)

  • ServerB 接收请求就会 插入或更新数据库 从 ServerB 执行 $conn->close()


但是不知道为什么 Mongodb 插入或更新的时候抛出异常
抛出的异常 Google了也找不到问题所在(显示该 database 不能 insert 的异常)
我以为是数据请求数大的问题
摸不着头脑就尝试 ServerAServerB 之间用 Channel 通信


  • ServerA 发送时,会 Channel Publish 来发送数据

  • ServerB 监听 Channel ,接收请求就会 插入或更新数据库


一样的业务我就把通信的更换而已就不抛出异常了 🤔️
虽然问题是解决了,但困扰我的就在这个 Channel 服务上
因为跟 问题01 一样 进程是 1,如果信息量大的话会不会阻塞?
还是我根本上理解错了概念了吗?以下是我的代码


🔴 原先抛出异常的代码

$serverA = new Workerman\Worker();
$serverA->onWorkerStart = function(){
    $remote = new AsyncTcpConnection($remote_websocket);
    $remote->onMessage = function($data){
        // 一些业务...
        $serverB = AsyncTcpConnection('tcp://127.0.0.1:1111');
        $serverB->send($some_data);
        $serverB->connect();
    };
    $remote->connect();
};
$serverB = new Workerman\Worker('tcp://127.0.0.1:1111');
$serverB->count = 10;
$serverB->onWorkerStart = function(){};
$serverB->onMessage = function($conn,$data){
    // 一些业务...
    // 插入或更新数据库
    $conn->close();
};

🟢 现在正常跑通的代码

$serverA = new Workerman\Worker();
$serverA->onWorkerStart = function(){
    Channel\Client::connect('127.0.0.1',1111);
    $remote = new AsyncTcpConnection($remote_websocket);
    $remote->onMessage = function($data){
        // 一些业务...
        \Channel\Client::publish('execute',$some_data);
    };
    $remote->connect();
};
$serverB = new Workerman\Worker();
$serverB->onWorkerStart = function(){
    Channel\Client::connect('127.0.0.1',1111);
    Channel\Client::on('execute',function($data){
        // 一些业务...
        // 插入或更新数据库
    });
};
409 1 0
1个回答

walkor

进程数设置参考文档 https://www.workerman.net/doc/workerman/faq/processes-count.html
总的来说有数据库、redis、curl等阻塞io操作的进程数多开一些,比如cpu的3-8倍。
如果业务没有io操作进程数开成和cpu核数一样即可。

Mongodb 插入或更新异常可能是Mongodb 初始化的时机错误,不要提前初始化,可以在onWorkerStart里初始化。
这部分参考文档 https://www.workerman.net/doc/workerman/development/before-development.html#%E4%B8%89%E3%80%81%E5%8C%BA%E5%88%86%E4%B8%BB%E8%BF%9B%E7%A8%8B%E5%92%8C%E5%AD%90%E8%BF%9B%E7%A8%8B

  • Nucreon 2023-04-18

    emmmm 🤔️ 我也是在 onWorkerStart 初始化的
    还是我这边的问题,我得多尝试几下看看是什么原因
    实力不行用苦力来凑合 🤣

年代过于久远,无法发表回答
🔝