Workerman 我到现在已经使用?🤨 (学习)了一年多左右,
但是到现在还困惑在这些通信机制和进程(因为长时间泡在 PHP-FPM+NGINX里不太懂其他)
按我理解的方式来说明的话
假设我们有两个服务,业务都是更新数据库
workerA 为 count = 10
workerB 为 count = 1
从某个地方同时请求 10个的话
worker A 因为是 10个 所以 把十个分配到每个进程
那么所花的总时间是 处理10个当中最长的worker B 因为是 1个 所以 把十个一个一个接收并更新
所以花的总时间为 全部处理完后的时间?
因为我之前跑的程序当中是 ServerA
监听 websocket
数据并发送到 ServerB
的场景
ServerA
只是 默认的worker ,没有配置端口(count 为 1)
ServerB
配置了端口和 http协议 并设置 count 为 10
爬虫业务部分是:如果 在监听中 type 为指定的 value 的话
从ServerA
把数据发送给 ServerB
,ServerB
接收后会插入或更新数据库
ServerA
发送时,会 AsyncTcpConnection
来连接 ServerB
发送数据 $conn->send($data)
ServerB
接收请求就会 插入或更新数据库 从 ServerB
执行 $conn->close()
但是不知道为什么 Mongodb 插入或更新的时候抛出异常
抛出的异常 Google了也找不到问题所在(显示该 database 不能 insert 的异常)
我以为是数据请求数大的问题
摸不着头脑就尝试 ServerA
和 ServerB
之间用 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){
// 一些业务...
// 插入或更新数据库
});
};
进程数设置参考文档 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
emmmm 🤔️ 我也是在 onWorkerStart 初始化的
还是我这边的问题,我得多尝试几下看看是什么原因
实力不行用苦力来凑合 🤣