in provider/fsof/FSOFProtocol.php [136:177]
private function checkSwooleStatus($request, $host, $port)
{
$status = self::FSOF_SWOOLE_STATUS_OK;
$appConfig = $this->getAppConfig();
if(false == $appConfig['fsof_setting']['overload_mode'])
{
return $status;
}
$reqInQueueTime = DubboParser::getReqInQueueTime($request);
if($reqInQueueTime)
{
$appName = $this->getAppName();
//waiting time inqueue(ms)
$waitingTime = $appConfig['fsof_setting']['waiting_time'];
//Number of packet overload in a row
$overloadNumber = $appConfig['fsof_setting']['overload_number'];
$lossNumber = $appConfig['fsof_setting']['loss_number'];
$this->logger->debug($host.":".$port.', waitingTime = '.$waitingTime.', overloadNumber = '.$overloadNumber.', lossNumber = '.$lossNumber);
$curTimestamp = round(microtime(TRUE)*1000);
$reqInQueueTime_ms = round($reqInQueueTime / 1000);
if(($curTimestamp - $reqInQueueTime_ms) >= $waitingTime)
{
//swoole_table记录过载的次数新增1
$this->server->getOverloadMonitor()->overloadIncr();
$this->logger->warn($host.':'.$port.'|' .$appName.'|服务过载|inQueue:'.$reqInQueueTime_ms.'; curTime:'.$curTimestamp.';waitingTime:'.$waitingTime);
//判断连续过载次数是否达到开启丢包请求阀值
if ($this->server->getOverloadMonitor()->getoverloadNum() >= $overloadNumber)
{
//重置过载次数,开启过载丢包模式
$this->server->getOverloadMonitor()->resetOverloadNum_setLossNum($lossNumber);
$this->logger->error($host.':'.$port.'|' .$appName.'|服务连续过载,开启丢消息模式');
}
$status = self::FSOF_SWOOLE_STATUS_OVERLOAD;
}
else
{
//清理swoole_table过载记录数量
$this->server->getOverloadMonitor()->clear();
}
}
return $status;
}