kedebug @kedebug 2014-03-08 14:26

「YoHub」基于事件驱动的异步网络编程框架

YoHub是我个人开源的第三个项目,语言是C++。主要灵感启发自 Kylin (百度首席架构师林士鼎先生的baidu in-house作品,用于百度内部异步网络编程)。 流露出代码只是零零点点,只有http://dirlt.com/kylin.html文章大概介绍了下。 但是基于事件驱动异步网络编程的思想,应该是当前高并发生产环境下解决问题的主要途径。引用林仕鼎先生的一句话: “最关键的是思维的转变,由同步思维换成异步思维。而当你习惯了异步思维后,其实慢慢也会发现单机系统和多机系统并没有太大差别,从而也将跨入分布式系统的阶段。” YoHub正是引用了这样的一个异步思路,把那篇文章中的一些代码框架给串了起来。目前代码还在不断的完善中。网络编程的一些主要组件借鉴了 muduo 的 boost function/bind 回调的方式,极大了避免了虚函数的使用,使代码结构更加清晰,还有用智能指针管理长连接等等。具体的代码大家可以看: https://github.com/kedebug/yohub 个人感觉有几个值得一说的点: 1. 网络线程和工作线程分离: 其实指的便是multiple reactors + worker pool工作方式,使得可以针对不同的业务场景,灵活调整网络线程和工作线程的个数,让程序更加灵活高效。 2. 非阻塞到异步: linux内核对异步的支持不是特别好,于是目前只能用工作线程来模拟这一异步的过程,这也就是上面所提到的异步思路。 3. 智能指针: 网络编程中,一个非常值得注意的点是:tcp connection的生命周期管理。比较经典的一个场景是:当我们的任务放到工作线程中,但是还没来得及执行连接便断开。这时候应该怎么处理? kylin采用的是引用计数来解决这一问题,在设计之初,我也想过用计数的方法,但是这样thread pool就不具备通用性,要用虚函数,每个任务都要继承一个 ctx->Ref() 这样的方法,如果入线程池的只是简单的任务要怎么办? 所以我这里利用智能指针,这点是很大程度上受到muduo网络库的影响。YoHub受益于此,在此也想提醒每个学C++的同学,不妨了解下智能指针,大有裨益。 另外个人最近在学习CMU和MIT的分布式课程,准备用 golang 写一些分布式 cache 的东东。如果您感兴趣,欢迎一起探讨 :) -- kedebug

4
1
1

哈哈,文章有更新了下说明,最底层的实现是reactor。

回复

是不是 proactor 模式?

回复

也不是,Linux内核是不支持异步网络IO的,只能用epoll, poll这种非阻塞的函数调用。但是我们可以通过后台线程完成IO操作,然后通知用户。这种情况下,只能算是模拟异步完成的方式。当然windows下面就方便很多了,直接有一套IOCP机制,可以直接拿来用。

回复

顶一下,是不是就是基于AIO思想的网络框架

回复