最近突然想了解怎样设计一个支持百万连接的后台server架构。
要设计一个支持百万连接的后台server,我们首先要知道会有哪些因素限制后台server的高并发连接,这里想到的因素有以下几点:
1、操作系统的参数设置能否支持百万并发连接;
2、操作系统维持百万并发长连接需要多少内存;
3、应用层面上维持百万并发长连接需要多少内存;
4、百万并发长连接的吞吐量是否超过了硬件网卡的限制。
在学习的过程中,主要针对的是1、2、4,第3点一般跟业务相关,这里暂时没有考虑。
本篇文章估计需要多次才能完成,现在初步的想法是先写一个demo程序,然后后面再慢慢测试优化。
1、后台设计
1.1 后台设计图
如下为后台的设计结构:
1、首先主进程根据机器CPU个数,创建对应数量的管道;
2、创建完对应的管道之后,再创建一样数量的线程,每个线程绑定一个CPU;
3、主进程开始初始化socket,然后accept,当接收到一个客户端连接时,就把conn_fd写到某个pipe中;
3、每个线程创建epoll,然后监听对应pipe的写端fd,当监听到pipe中有数据时,就读取该数据,格式化为fd,将该fd加入epoll进行监听。
1.2 编码实现
根据1.1的设计,我们编写代码,包括server模块和worker模块。server模块负责创建pipe、线程、和监听客户端连接;worker模块负责处理每个客户端的连接。代码如下所示:
1.2.0 common
1 #ifndef _SERV_COMMON_H 2 #define _SERV_COMMON_H 3 4 typedef struct { 5 int id; 6 int fd; 7 } thread_arg; 8 9 #define SERV_PORT 9876 10 #define MAX_LINE 1024 11 12 #endif