首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

筹建一个后台服务器-服务端(异步,大并发)

2013-04-02 
搭建一个后台服务器--服务端(异步,大并发)上篇的阻塞模式下服务器的并发只有几K,而真正的server 像nginx,

搭建一个后台服务器--服务端(异步,大并发)

上篇的阻塞模式下服务器的并发只有几K,而真正的server 像nginx, apache, yumeiz 轻轻松松处理几万个并发完全不在话下,因此大并发的场合下是不能用阻塞的。

1W的并发是一个分隔点,如果单进程模型下能达到 的话,说明至少在服务器这块你已经很厉害了。

服务器开发就像一门气功,能不能搞出大并发,容错性处理得怎么样,就是你有没有内功,内功有多深。


异步模式是专门为大并发而生,linux下一般用 epoll 来管理事件,下面就开始我们的异步大并发服务器实战吧。

跟阻塞开发一样,先来看看设计过程:

1.创建事件模型。

2.创建监听连接并监听。

3.将监听连接加入事件模型。

4.当有事件时,判断事件类型。

5.若事件为监听连接,则产生客户连接同时加入事件模型,对客户连接接收发送。

6.若事件为客户连接,处理相应IO请求。


为了让大家一概全貌,我用一个函数实现的( 一个函数写一个2W并发的服务器,你试过么),可读性可能会差点,但是对付这道面试题是绰绰有余了。

实际开发过程如下:

先定义一个事件结构,用于对客户连接进行缓存

if( event_flag | EPOLLIN ){if( tobe_myevent->rc_pos < 64 ){flag = recv( sock_client, tobe_myevent->recv + tobe_myevent->rc_pos, 64 - tobe_myevent->rc_pos, 0 );if( flag <= 0 ){continue;}tobe_myevent->rc_pos += flag;if( tobe_myevent->rc_pos < 64 ){continue;}if( tobe_myevent->recv[31] || tobe_myevent->recv[63] ){printf( "your recv does follow the protocal\n");tobe_myevent->fd = 0;close( sock_client );continue;}flag = send( sock_client, tobe_myevent->send, sizeof( time_t ), 0 );if( flag < sizeof( time_t ) ){if( flag > 0 )tobe_myevent->sd_pos += flag;tobe_event.events = EPOLLET | EPOLLOUT;tobe_event.data.u32 = wait_events[i].data.u32;epoll_ctl( epfd, EPOLL_CTL_MOD, sock_client, &tobe_event );continue;}tobe_myevent->fd = 0;close( sock_client );}}
到此,一个异步服务器搭建完毕,轻松实现2W的并发量,代码你可以在这里下载,下一篇是完整的代码,满足喜欢在网上看代码的码狂们。。。


热点排行