前文已经说明,dispatch server必须以单进程方式运行,才能正常转发消息,这样就导致我们必须单独启动一个beyod serverr实例, 会给部署和运维带来一些麻烦,如果集群规模较小,完全可以让beyod server中同时提供网络服务和dispatcher server, 只需要做简单的操作即可:
config/main.php
'components' => [
'server' => [
'class' => 'app\MyServer', //使用自定义的类
'worker_num' => 17, //1个进程提供dispatcher server, 其16个进程提供网络服务
//配置网络服务
'listeners' => [
'http' => [
'class' => 'beyod\Listener',
'listen' => 'tcp://0.0.0.0:9723',//监听的协议和端口
'handler' => [//网络事件回调处理器
'class' => 'beyod\protocol\http\Handler',
'document_root' => __DIR__.'/../webroot',
],
'parser' => [
'class'=>'beyod\protocol\http\Parser',
],
],
//订阅服务器
'dispatch' => [
'class' => 'beyod\Listenner',
'listen' => 'tcp://0.0.0.0:7724',
'parser' => 'beyod\dispatcher\Parser',
'handler' => 'beyod\dispatcher\Handler'
],
],
],
//...
]
appMyServer.php
<?php
namespace app;
use Yii;
use beyod\Server;
use beyod\MessageEvent;
use beyod\IOEvent;
class MyServer extends \beyod\Server
{
public function onWorkerStart($workerId, $GPID)
{
parent::onWorkerStart($workerId, $GPID);
//在第一个进程上,停止所有网络服务,只启动dispater server。
if($workerId ==1) {
foreach($this->listenners as $name => $listenner) {
if($name == 'dispatch') continue;
$listenner->stopAccept();
}
}
}
}
如此,我们就可以很容易通过进程id设置其功能,对简化部署和运维,会有不少的帮助。