libeasy网络框架简介

libeasy网络框架简介

      libeasy是个网络框架,这个网络框架基于事件驱动模型,libeasy可以有多个网络I/O线程,每个网络I/O线程一个event loop,事件驱动模型基于开源的libev实现。

      libeasy不同于其它的网络框架比如tbnet,muduo。tbnet,muduo等网络框架的目的就是向应用层暴露出简单的发包和收包的接口,让应用层从底层发包和收包的处理细节中解放出来,使得应用层能更加专注于业务逻辑的实现,为了做到这些,网络框架帮助应用程序管理连接,管理输入输出缓冲区,处理具体的发包收包等细节和错误的处理,处理流控,并且允许应用层注入封包,解包,新建连接时处理,断开连接时处理,收到包后处理包的逻辑等。libeasy与这些网络框架稍不同,从高层次看,libeasy中的线程分为业务逻辑线程和网络I/O线程,无论哪种线程,线程都有唯一的一个event loop,工作的时候,I/O线程和网络I/O线程有对应关系,他们之间通过pipe来实现线程的唤醒,原理就是业务逻辑线程的event loop监听pipe的读端,当I/O线程A接收到包的时候,往pipe的写端写入数据,业务逻辑线程event loop返回,从任务链表中取任务执行。可以说,libeasy已经超出了网络框架的范畴,但是libeasy也支持和普通的网络框架一样,仅仅使用网络 I/O线程部分。     

      TFS目前使用的网络框架是tbnet, tbnet包含一个IO线程,负责接收新的连接,处理已建立连接上的请求(包含网络包的序列化和反序列化);IO线程接收网络请求包后,可以选择直接由IO线程处理,也可以将其push到一个请求队列,由后端的工作线程池处理。tbnet的主要问题在于只有一个线程负责网络IO,会受到单个CPU的处理能力限制,发挥不了多核的优势。

     TFS的dataserver是IO密集型服务,主要瓶颈不在CPU上,而在处理IO上(慢请求),使用tbnet框架非常合适;而nameserver(NS)则不同,其频率最高的请求是“查询block的副本位置信息”,请求处理逻辑简单,很快就能结束,这种"快请求"如果加到请求队列,再由后端的工作线程处理,入队、出队的开销都快赶上了服务请求的开销。

      NS上的快请求最好是在IO线程里直接处理,但tbnet的IO线程只有一个,导致NS的处理能力受限;为解决这个问题,最近将NS的网络框架替换为libeasy。相比tbnet,libeasy包含多个IO线程,每个IO线程都能接受并处理网络请求,IO线程之间相互独立(libeasy实际上是基于libev的一个封装,每个IO线程对应libev的一个event loop)。

      对于慢请求,如果直接在IO thread里处理,则会导致这个IO线程“假阻塞", 该IO线程后续请求都需要排队等待;libeasy同样采用队列的方式来解决这个问题,先将慢请求加入请求队列,再由后端的单独的线程池来处理。

参考资料: 

http://www.cnblogs.com/foxmailed/archive/2013/02/17/2908180.html

http://blog.yunnotes.net/index.php/libeasy_arch/

你可能感兴趣的:(分布式消息系统)