Skip to content

plantree/Slack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Slack: A C++ Network Library basing on Reactor

Build Status license

Introduction

陈硕老师的muduo代码整体过了一遍,收获很多,尽管整个过程并不轻松,头一次看这么复杂的源码。代码和书都是第一遍看,很多细节没有深究,打算第二遍把整个逻辑重新梳理一下,顺道记在博客里,整个学习过程,遇到的问题,解决的方案,以及为什么的trade off

Goals

  • 理解Reactor设计的总体思路,以及要解决的问题。和陈硕老师推荐的Linux系统下C++多线程服务端编程模式one loop per thread + thread pool这样设计的原因
  • 使用Catch2做单元测试,使用C++11语法对源代码部分重写,去除Boost依赖,完全使用标准库基础设施
  • 学习使用Git做版本控制,使用Travis做持续集成,构建工具采用CMake

Environment

  • OS: Ubuntu 18.04 (64 bit)
  • Compiler: GCC 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
  • Build: CMake 3.10.2

Design

  • 按照baselognethttp的顺序依次实现四个独立的库(muduo中只是按照basenet,示例放到example中)
  • 单元测试用例放在各自的库所在文件夹

Features

  • 底层使用Epoll水平触发实现IO多路复用,文件描述符均为非阻塞
  • 原子类依赖C++11中的atomic,借助智能指针shared_ptrunique_ptr管理资源,去除Boost依赖
  • RAII编程技巧,借助对象的生存期管理资源的申请和释放
  • 定时器事件借助timerfd,线程唤醒事件通知借助eventfd,以及监听和连接套接字,统一纳入到IO多路复用体系中
  • 基于红黑二叉搜索树的定时器队列
  • 基于双缓冲的异步日志
  • Reactor设计模式,主Reactor通过accept接受连接,按照Round Robin的方式依次派发给线程池中的次Reactor

Statistics

  1. 代码统计

  1. ab测试(ab是Apache基金会下的一款HTTP服务器压测工具)

    ab -c 100 -n 100 -k http://localhost:8000/
    

    并发数100,测试100次,Keep-alive(长连接)

    作为对比,使用了Nodejs的Express框架,访问的都是https://github.com/plantree/Slack的html内容

    Nodejs:

    Slack(线程1):

    Slack(线程10):

    测试是一项复杂而细致的工作,这里只是简单测试,略作比较,后面会再去研究。

Plan

  • 继续研究muduo源码,熟悉各种网络编程的例子
  • 丰富HTTP服务器,实现为REST风格接口
  • 学习Java,了解Netty

Reference

About

A network library following muduo

Resources

License

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages