Workerman 我到現(xiàn)在已經(jīng)使用??? (學(xué)習(xí))了一年多左右,
但是到現(xiàn)在還困惑在這些通信機(jī)制和進(jìn)程(因?yàn)殚L(zhǎng)時(shí)間泡在 PHP-FPM+NGINX里不太懂其他)
按我理解的方式來(lái)說(shuō)明的話(huà)
假設(shè)我們有兩個(gè)服務(wù),業(yè)務(wù)都是更新數(shù)據(jù)庫(kù)
workerA 為 count = 10
workerB 為 count = 1
從某個(gè)地方同時(shí)請(qǐng)求 10個(gè)的話(huà)
worker A 因?yàn)槭?10個(gè) 所以 把十個(gè)分配到每個(gè)進(jìn)程
那么所花的總時(shí)間是 處理10個(gè)當(dāng)中最長(zhǎng)的worker B 因?yàn)槭?1個(gè) 所以 把十個(gè)一個(gè)一個(gè)接收并更新
所以花的總時(shí)間為 全部處理完后的時(shí)間?
因?yàn)槲抑芭艿某绦虍?dāng)中是 ServerA
監(jiān)聽(tīng) websocket
數(shù)據(jù)并發(fā)送到 ServerB
的場(chǎng)景
ServerA
只是 默認(rèn)的worker ,沒(méi)有配置端口(count 為 1)
ServerB
配置了端口和 http協(xié)議 并設(shè)置 count 為 10
爬蟲(chóng)業(yè)務(wù)部分是:如果 在監(jiān)聽(tīng)中 type 為指定的 value 的話(huà)
從ServerA
把數(shù)據(jù)發(fā)送給 ServerB
,ServerB
接收后會(huì)插入或更新數(shù)據(jù)庫(kù)
ServerA
發(fā)送時(shí),會(huì) AsyncTcpConnection
來(lái)連接 ServerB
發(fā)送數(shù)據(jù) $conn->send($data)
ServerB
接收請(qǐng)求就會(huì) 插入或更新數(shù)據(jù)庫(kù) 從 ServerB
執(zhí)行 $conn->close()
但是不知道為什么 Mongodb 插入或更新的時(shí)候拋出異常
拋出的異常 Google了也找不到問(wèn)題所在(顯示該 database 不能 insert 的異常)
我以為是數(shù)據(jù)請(qǐng)求數(shù)大的問(wèn)題
摸不著頭腦就嘗試 ServerA
和 ServerB
之間用 Channel
通信
ServerA
發(fā)送時(shí),會(huì) Channel Publish
來(lái)發(fā)送數(shù)據(jù)
ServerB
監(jiān)聽(tīng) Channel
,接收請(qǐng)求就會(huì) 插入或更新數(shù)據(jù)庫(kù)
一樣的業(yè)務(wù)我就把通信的更換而已就不拋出異常了 ???
雖然問(wèn)題是解決了,但困擾我的就在這個(gè) Channel 服務(wù)上
因?yàn)楦?問(wèn)題01
一樣 進(jìn)程是 1,如果信息量大的話(huà)會(huì)不會(huì)阻塞?
還是我根本上理解錯(cuò)了概念了嗎?以下是我的代碼
$serverA = new Workerman\Worker();
$serverA->onWorkerStart = function(){
$remote = new AsyncTcpConnection($remote_websocket);
$remote->onMessage = function($data){
// 一些業(yè)務(wù)...
$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){
// 一些業(yè)務(wù)...
// 插入或更新數(shù)據(jù)庫(kù)
$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){
// 一些業(yè)務(wù)...
\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){
// 一些業(yè)務(wù)...
// 插入或更新數(shù)據(jù)庫(kù)
});
};
進(jìn)程數(shù)設(shè)置參考文檔 http://m.wtbis.cn/doc/workerman/faq/processes-count.html
總的來(lái)說(shuō)有數(shù)據(jù)庫(kù)、redis、curl等阻塞io操作的進(jìn)程數(shù)多開(kāi)一些,比如cpu的3-8倍。
如果業(yè)務(wù)沒(méi)有io操作進(jìn)程數(shù)開(kāi)成和cpu核數(shù)一樣即可。
Mongodb 插入或更新異常可能是Mongodb 初始化的時(shí)機(jī)錯(cuò)誤,不要提前初始化,可以在onWorkerStart里初始化。
這部分參考文檔 http://m.wtbis.cn/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 初始化的
還是我這邊的問(wèn)題,我得多嘗試幾下看看是什么原因
實(shí)力不行用苦力來(lái)湊合 ??