Mycat架构与源码精析之三“业务处理流程”

上一篇我们讲了Mycat的线程模型,今天我们聊聊一条常规的查询sql,在mycat中的执行流程。

 

一条查询sql的执行,大概会经历下图的n个步骤,其发生和在各组件中的流转顺序如其数字标号,大体流程应该还是比较好懂的吧?有朋友看不懂的可以留言一下,这里就不多说啦,大家请看图:

 

执行流程图(此图是原创)

 

 

 

下面对几个核心设计要点进行讲解,大家要好好理解哦~

 

1.为什么使用NIO?

NIO本质是操作系统的多路复用IO,它是同步非阻塞的,而BIO是同步阻塞IO,有兴趣的同学可以查阅相关资料,这里不展开讨论。

通常情况下,NIO会比BIO有更高的性能,因为NIO可以实现1个线程,同时监听多个连接的读写事件,而BIO只能1个线程监听1个连接的读写,在海量连接的场景下,BIO将需要更多的线程,消耗更多的资源。

MyCat基于Jdk原生的NIO api实现网络框架,并没有使用像Netty这样库。

 

2.为什么拆分Business线程池

由于Reactor和connection是强绑定的,一个Reactor会绑定多个Connection,当一个Reactor在处理一个connection的读写和业务逻辑时,其他connection如果也读事件就绪,就会阻塞等待,导致单个connection的处理延迟增大。所以,把一些耗时的业务逻辑分离到独立的business线程池来做,一般情况下有利于减少这种延迟。business作为公共资源,只要仍有空闲线程,都可以处理业务。

 

3.回写流程为什么既可能由Business也可能由reactor完成?

这是一种很常规的做法,其核心是尽量减少阻塞和资源消耗。如果通道可写,则由business线程直接完成回写,而非交由reactor,这样可以减少线程切换的开销。而如果通道正忙(socket的写缓冲区已满),business写的话,就需要等待通道可写,这样会造成business线程阻塞,所以这是business把写事件注册到reactor的selector中,并把数据写入一个队列,由reactor监听通道可写事件。由于reactor是NIO的,所以不会因为等待写事件而阻塞其他事情的处理,当通道可写时,reactor会从队列中获取需要回写的数据,并进行回写,从而达到了减少阻塞的效果。

 

更多精彩内容,请持续关注哦~

 

 

ps:本系列讲解基于Mycat1.5.2

返回>>系列目录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值