文章目录
- 1.限制服务器最大并发连接数
- 2.用Timing wheel踢掉空闲连接
1.限制服务器最大并发连接数
- MuduoManual.pdf P108
- eg测试:47\jmuduo\examples\maxconnection\main.cc
47\jmuduo\examples\maxconnection\echo.h
47\jmuduo\examples\maxconnection\echo.cc - 测试:
回射服务器 - 回射客户端,使用nc测试
第一个连接 - 第二个连接
- 第三个连接
2.用Timing wheel踢掉空闲连接
- MuduoManual.pdf P122 (1)粗暴方法1:注册一个每过一秒钟,重复执行的定时器 EventLoop::runEvery(…); 每隔一秒钟,执行以下的代码。遍历整个连接列表,判断是否超时,如果超时,就断开。
(2)粗暴方法2:
为每个连接注册一个一次性的定时器,超时时间为8s。
close(connection);
(3)总结如下:
如果是8s钟,那么该循环队列就有8个格子(8个桶bucket);
这个循环队列只有1个尾指针tail;
尾指针tail同样也需要注册一个1s钟的定时器,而且是重复的定时器,每过1s钟,tail向前移动一格,所以尾指针所指向的位置(即里面的连接),其超时时间就是8s钟;
若时间轮盘的一个阁子只能存放一个连接的话,那么最多只能支持最多8个并发连接,而我们的并发连接数肯定远远大于8个连接,所以一个阁子存放的连接数不止一个,可以是一个集合。- eg测试:47\jmuduo\examples\idleconnection\echo.h
47\jmuduo\examples\idleconnection\echo.cc
47\jmuduo\examples\idleconnection\main.cc
注意数据结构:shared_ptr,weak_ptr;链表,环形缓冲区,hash_set,以及排序链表的使用 - 测试:
客户端,超时时间是10s - 服务端,处于9,说明是10s超时;tail向前移动connectionBuckets_.push_back(Bucket());,其生命期就变为了9s
- 引用计数=0时,断开连接
- 此外,一个阁子可以存放多个连接。若开启了2个客户端,则服务端的定时器状态如下,一个阁子可以存放多个连接。
- eg:47\jmuduo\examples\idleconnection\sortedlist.cc
- 测试:服务器端
- 客户端,使用nc测试