网络服务leader-follower线程池模式

今天主要给大家分享一下基于非阻塞IO的TCP网络服务程序的线程池模式。


TCP应用程序
有过网络服务通信经验的人都知道,无论服务端怎么架构,始终要通过socket创建,端口绑定,端口监听,然后进入accept的阶段。伪代码:
int socksvr=socket(para,para,para);
bind(socksvr,addr,sizeof(addr));
listen(socksvr,MAX_PENDING);
while(1){
int sockclt=accept(socksvr,para,para);
create_pthread(para,para,);
if(exit) break;

}


通常上面的这段代码都是放在主线程里面,代码里面创建的线程为工作线程,这段代码里面也采用了多线程,但是能够解决大多数场景,但是当客户端短时间大量的连接上来的时候,由于创建线程比较耗时,因此在一轮循环里耗时较多,就可能会导致客户端超时,连接失败。同时由于客户端多了,那么创建的线程也比较多,多线程之间调度也耗费时间,所以这种架构就只能解决普通的业务量,应对不了高并发和大量的长连接。通常应对高并发都是采用线程池的模式,几乎现在所有的网络服务程序都会采用线程池,但是为什么有的应用服务比较好,自己平时写的应用怎么就不稳定,应对不了高并发呢。这个问题主要就是线程池的设计结构导致的。当然我们自己没有经验的时候,设计的线程池实际上都很差。


leader-follower 线程池
leader-follower模式实际上就是线程池调度模式,它主要体现为我们在对线程的调度的时候的一种方式。这种模式其实在一些生意比较火爆的小饭店用的比较多。做个类比,我们去饭店吃饭的时候,首先是进入饭店,然后服务员接待我们,然后向服务员点菜。而客户端连接服务端,流程也是这样的,客户端到了,服务端通过accept进行接待,然后通过recv接受数据,然后开始进行处理。所以我们在饭店就会看到两种模式接待模式,第一种就是在大门口有一个迎宾小姐,你到了然后他就说欢迎光临,然后你就自己走到店里面去坐着,然后在走过来一个服务员让我们点菜,其实这就是传统的线程池模式,伪代码如下:
while(1){
int sockclt=accept(socksvr,para,para);
get_pthread_from_pool(para,para,);
if(exit) break;

}


在这个过程中while循环所在的线程就是迎宾小姐,代码里面得到的线程就像餐馆的服务员,服务员和我们交流,完成点菜就刚好对应通过recv收数据。我们点完菜之后,服务员将菜单交到后台厨房,后台厨房做菜的过程就对应服务程序里面的数据处理,厨房做好菜之后再由服务员端给我们,对于我们来说根本不知道是厨师做的菜就像是服务员做的菜一样。因此其实普通的服务程序就是普通的餐馆运营模式。


在一些好的餐馆里面的运营模式就跟普通餐馆的运营模式不一样,包括现在很多的理发店他们都是采用了一种更好的运营模式。安排了一系列服务员在大门口排队,当有客人来了的时候,最前面的服务员就接待客人,然后带领客人到餐桌边坐下,让客人点菜,点完菜交给厨房之后,再次回到大门那里排队。这种运营模式,可以很明显让客户感觉到自己就是贵宾,不会在大门口那里等很长一段时间,同时大门那里的处理速度也很快。这种模式就是所谓的leader-follower模式,当然这种模式也可以在网络程序中使用,伪码如下:


class Thread{
void doThing(){
waitBecomeLeader();
int sockclt=accept(socksrv,,,);
recv(data,,)
sendDataToBackEnd(data,this);
pushToPool(this);
}
};
class ThreadPool{
void run(){
Thread* th=getLeaderThreadFromPool();
th->doThing();
}
};
ThreadPool pool;

pool.run();


这种线程池设计模式之所以被称为leader-follower模式,就是因为所有线程只有变成了leader线程之后才能接客,一旦他接到客人,他就变成了worker模式,开始对这个客人进行服务,当他服务完毕之后,再次回到线程池中成为follower模式。因此这种线程池模式被称为leader-follower模式。


后记

当然一个网络服务要做到稳定,高效,肯定需要各个方面的去进行设计,今天只是简单的从多线程的角度进行了一点好的设计的分享,实际上还有内存池,阻塞非阻塞方面进行设计。我相信一句话,高效稳定的服务不是调试出来的,而是靠设计出来的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值