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