kedebug

非专业搬砖技术研究

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

| Comments

YoHub 是我个人开源的第三个项目,语言是 C++。主要灵感启发自 kylin (百度首席架构师林士鼎先生的 baidu in-house 作品, 用于百度内部异步网络编程)。流露出代码只是零零点点,只有 dirlt 的文章大概介绍了下。 但是基于事件驱动异步网络编程的思想,应该是当前高并发生产环境下解决问题的主要途径。

引用林仕鼎先生的一句话: “最关键的是思维的转变,由同步思维换成异步思维。而当你习惯了异步思维后,其实慢慢也会发现单机系统和多机系统并没有太大差别, 从而也将跨入分布式系统的阶段。”

YoHub 正是引用了这样的一个异步思路,把那篇文章中的一些代码框架给串了起来。目前代码还在不断的完善中。 网络编程的一些主要组件借鉴了 muduoboost function/bind 回调的方式,极大了避免了虚函数的使用,使代码结构更加清晰, 还有用智能指针管理长连接等等。代码是放在了 GitHub 上面,有兴趣的同学可以看看。

个人感觉有几个值得一说的点:

网络线程和工作线程分离

其实指的便是 Multiple Reactors + Worker Pool 工作方式,使得可以针对不同的业务场景,灵活调整网络线程和工作线程的个数,让程序更加灵活高效。

非阻塞(non-blocking)到异步(asynchronous)

Linux 内核对异步的支持不是特别好,于是目前只能用工作线程来模拟这一异步的过程,这也就是上面所提到的异步思路。

智能指针 shared_ptr/weak_ptr

网络编程中,一个非常值得注意的点是: TCP Connection 的生命周期管理。 比较经典的一个场景是:当我们的任务放到工作线程中,但是还没来得及执行连接便断开。这时候应该怎么处理? kylin 采用的是引用计数来解决这一问题,在设计之初,我也想过用计数的方法,但是这样 thread pool 就不具备通用性,要用虚函数, 每个任务都要继承一个 ctx->Ref() 这样的方法,如果入线程池的只是简单的任务要怎么办? 所以我这里利用智能指针,这点是很大程度上受到 muduo 网络库的影响。YoHub 受益于此,在此也想提醒每个学 C++ 的同学,不妨了解下智能指针,大有裨益。

Comments