前言
除了限制最大链接数,tars还会在接收队列中做过载保护:
-
接收队列中的请求包数量
-
请求包在接收队列中停留的时间
一.接收队列插入请求包时
在push请求包时,会先判断接收队列当前的状态:
队列的容量在Adapter的queuecap配置项中配置,默认的配置模板生成的配置值是50000:
<TestApp.HelloServer.HelloObjAdapter>
.......
queuecap=50000
.......
</TestApp.HelloServer.HelloObjAdapter>
然后根据接收队列当前的状态做不同的处理:
- 注意,未过载时是push到接收队列后面;过载时是push到队列前面
- 已满时,直接把请求包丢掉了。这种状态下,服务已经严重过载了,或者业务线程被阻塞了消费不了请求包
核心代码:
void TC_EpollServer::NetThread::Connection::insertRecvQueue(recv_queue::queue_type &vRecvData)
{
if(!vRecvData.empty())
{
int iRet = _pBindAdapter->isOverloadorDiscard();
if(iRet == 0)//未过载
{
_pBindAdapter->insertRecvQueue(vRecvData);
}