gateway worker 分離部署
什么是Gateway Worker分離部署
GatewayWorker有三種進(jìn)程,Gateway進(jìn)程負(fù)責(zé)網(wǎng)絡(luò)IO,BusinessWorker進(jìn)程負(fù)責(zé)業(yè)務(wù)處理,Register進(jìn)程負(fù)責(zé)協(xié)調(diào)Gateway與BusinessWorker之間建立TCP長(zhǎng)連接通訊。我們可以把Gateway BusinessWorker Register分開部署在不同的服務(wù)器上,當(dāng)業(yè)務(wù)進(jìn)程BusinessWorker出現(xiàn)瓶頸時(shí),單獨(dú)增加BusinessWorker服務(wù)器提升系統(tǒng)負(fù)載能力。同理,如果Gateway進(jìn)程出現(xiàn)瓶頸,則增加Gateway服務(wù)器。Register服務(wù)只有在進(jìn)程啟動(dòng)的時(shí)候協(xié)調(diào)Gateway與BusinessWorker建立TCP連接,集群運(yùn)行起來(lái)后通訊量極低,不會(huì)成為系統(tǒng)瓶頸。
部署示例
以Applications/Todpole為例,假如需要部署4臺(tái)服務(wù)器(192.168.0.1/4)提供高可用服務(wù),192.168.0.1/2運(yùn)行g(shù)ateway服務(wù)和register服務(wù),192.168.0.3/4運(yùn)行BusinessWorker服務(wù)。
gateway worker 分離部署擴(kuò)容步驟
-
設(shè)置服務(wù)器192.168.0.1/2上start_register.php 監(jiān)聽本機(jī)內(nèi)網(wǎng)ip,例如
new Register('text://192.168.0.1:1236');
(為了服務(wù)安全,請(qǐng)不要將1236端口暴露給外網(wǎng)) -
刪除服務(wù)器192.168.0.1/2上的start_businessworker.php。配置start_gateway.php中的
lanIp=192.168.0.x
與本機(jī)ip一致。配置registerAddress為['192.168.0.1:1236','192.168.0.2:1236']
,start_gateway.php文件最終類似下面配置。
文件Applications/Todpole/start_gateway.php
<?php
use \Workerman\Worker;
use \GatewayWorker\Gateway;
// gateway
$gateway = new Gateway("Websocket://0.0.0.0:8282");
$gateway->name = 'TodpoleGateway';
$gateway->count = 4;
// ==== 注意這里配置的是本機(jī)內(nèi)網(wǎng)ip ====
$gateway->lanIp = '192.168.0.1'; // 服務(wù)器192.168.0.2 上為 192.168.0.2
// ==== 注意這里配置 ====
$gateway->registerAddress = ['192.168.0.1:1236', '192.168.0.2:1236'];
$gateway->startPort = 2000;
$gateway->pingInterval = 10;
$gateway->pingData = '{"type":"ping"}';
...
-
打開192.168.0.3/4兩臺(tái)服務(wù)器,刪除start_gateway.php和start_reigster.php。設(shè)置start_businessworker.php的registerAddress為 ['192.168.0.1:1236', '192.168.0.2:1236']
-
逐臺(tái)啟動(dòng)
至此,GatewayWorker分布式部署完畢。
一些問(wèn)題及解答
為什么將Gateway與BusinesWorker分別部署在不同的服務(wù)器上?
首先說(shuō)明的是不一定非要將Gateway BusinessWorker分開部署,但是推薦分開部署,原因如下:
1、由于Gateway只負(fù)責(zé)網(wǎng)絡(luò)IO,只要服務(wù)器帶寬夠用,絕大多數(shù)情況下Gateway服務(wù)器不會(huì)成為瓶頸,所以在很長(zhǎng)時(shí)間我們只需要一臺(tái)或者少數(shù)幾臺(tái)Gateway服務(wù)器即可。由于我們不想BusinessWorker影響到Gateway,所以將Gateway和BusinessWorker分開部署
2、BusinessWorker主要負(fù)責(zé)業(yè)務(wù)邏輯。當(dāng)請(qǐng)求量增大時(shí),由于可能BusinessWorker業(yè)務(wù)比較復(fù)雜,負(fù)載可能會(huì)明顯升高,這時(shí)我們只要單純?cè)黾覤usinessWorker服務(wù)器即可,Gateway服務(wù)器則一般不需要變動(dòng),也就是不用通知客戶端Gateway的ip列表有所變動(dòng)
3、當(dāng)系統(tǒng)BusinessWorker負(fù)載較低,需要下線服務(wù)器時(shí),我們只需要下線BusinessWorker服務(wù)器即可,無(wú)需變動(dòng)GateWay服務(wù)器,也就不會(huì)導(dǎo)致客戶端鏈接因?yàn)榉?wù)器下線而斷開。
當(dāng)BusinessWorker服務(wù)器集群負(fù)載較低時(shí),需要下線一些機(jī)器怎么實(shí)施?
只需要停止BusinessWorker的服務(wù),運(yùn)行php start.php stop
,然后下線即可。Gateway服務(wù)器會(huì)自動(dòng)感知有BusinessWorker服務(wù)器下線,不會(huì)再將請(qǐng)求轉(zhuǎn)發(fā)給下線的機(jī)器,整個(gè)下線過(guò)程中不影響服務(wù)質(zhì)量。
當(dāng)Gateway服務(wù)器集群負(fù)載較低時(shí),需要下線一些機(jī)器怎么實(shí)施?
首先還是要說(shuō)明下Gateway服務(wù)器一般情況下不會(huì)成為系統(tǒng)瓶頸,所以一般你很長(zhǎng)時(shí)間內(nèi)Gateway服務(wù)器數(shù)量是一個(gè)穩(wěn)定的值,一般一臺(tái)即可
下線Gateway服務(wù)器,首先停止服務(wù),運(yùn)行php start.php stop
,此時(shí)會(huì)導(dǎo)致該服務(wù)器上已有的客戶端鏈接斷開,然后下線服務(wù)器即可。此時(shí)BusinessWorker會(huì)感知到有Gateway服務(wù)器下線,會(huì)自動(dòng)斷開與Gateway進(jìn)程的聯(lián)系。
如何給Gateway添加負(fù)載均衡
負(fù)載均衡方案是通用的,你可以用nginx代理、云廠商自帶的TCP負(fù)載均衡、或者在gateway域名DNS上添加多條A記錄。