Reactor的三种线程模型

理解Reactor 线程模型是理解Netty 的关键步骤之一,下面我将以一个通俗的例子来讲解Reactor 3种线程模型

我们以实际生活中吃饭的例子来做解释

通常去餐馆吃饭、例如海底捞是需要排队的,排队完成,有服务员来接待你,然后带领你去落座吃饭

这里面的服务员有多少个,是发现你来后直接带你找个空闲座位然后给你端茶倒水完了,再去迎接其它顾客;还是接待你的服务员在门口吆喝一声:里面的服务员,有客来了,你们来招待,然后服务员把你交给接待你的其它服务员,她再接待其它客户。类似这种接待方式的不同,其实就是线程模型的 不同,下面我们来分别解释。

1.  单线程模型

 单线程的好比是负责接待客户的服务员(线程),有且仅有一个,她接待完一个客户后,还要将客户领到用餐区,给他端茶倒水(好比是读、写),端茶倒水完成之后继续接待其它客户, 在接待的过程中正在用餐的客户还有可能要她加菜,她也得跑过去服务...., 总之,她啥事都得干,接客,接客的服务,都得干。

服务过程如下图所示

 这就是单线程模型,一个线程负责accept 新的客户端连接,还要负责客户端的读写请求。 弊端很明显:如果服务员罢工不干了,整个服务就要停掉;如果一个客户不讲理,缠着服务员不放,一直跟她讲话,服务员就无暇迎接新的客户,也无法及时响应其它客户的服务要求。

2. 多线程模型

单线程模型的缺点显而易见,因此有了多线程版本:大厅里有专门负责端茶倒水、加餐、擦鞋的多个服务员(好比是多线程),负责接待的服务员安心的负责迎接新的客户,每当有新的客户到来,他就从大厅里的服务员里找一个,把新顾客分配给他,以后这个服务员就负责服务好这个新客户即可。

相比单线程模型,一个线程安心的只负责接待新连接,其它的线程池负责新客户的读写。显然并发数、系统稳定性都有了较大提高。但多线程仍然有弊端:假如客服实在太多,即使是一个线程专门负责接待新连接,仍然有可能忙不过来,即无法应对并发量极大的情况。除此之外,如果这个服务员(线程)挂了,那么整个客户接待就会停止。为此而改进的线程模型应运而生:主从多线程模型。

3. 主从多线程模型

一组线程专门负责连接、另一组线程处理IO读写。它与多线程模型的主要区别在于其使用一组线程在一个共享的监听套接字上accept连接。主要是我了应付单个线程不足以快速处理内核中监听套接字的已连接套接字队列(并发量极大)的情况

服务过程如下图所示

如果要利用一组线程来负责客户端的连接,则需要用到reuseport机制, reuseport是一种套接字复用机制,它允许你将多个套接字bind在同一个IP地址/端口对上,这样一来,就可以建立多个服务来接受到同一个端口的连接,如果linux内核版本小于3.9,则不支持reuseport(注:部分centos发行版在低版本中已经打了reuseport patch,所以部分linux低版本发行版本也支持该特性)

nginx 就是利用了这种线程模型

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值