基于 libevent 开发的 C++ 11 高性能网络服务器 evpp

evpp是一个基于libevent开发的现代化C++11高性能网络服务器,自带TCP/UDP/HTTP等协议的异步非阻塞式的服务器和客户端库。

特性:

  • 现代版的C++11接口
  • 非阻塞异步接口都是C++11的functional/bind形式的回调仿函数(不是libevent中的C风格的函数指针)
  • 非阻塞纯异步多线程TCP服务器/客户端
  • 非阻塞纯异步多线程HTTP服务器/客户端
  • 非阻塞纯异步多线程UDP服务器
  • 支持多进程模式
  • 优秀的跨平台特性和高性能(继承自libevent的优点)

除此之外,基于该库之上,还提供两个附带的应用层协议库:

  • evmc :一个纯异步非阻塞式的memcached的C++客户端库,支持membase集群模式。详情请见:evmc readme
  • evnsq : 一个纯异步非阻塞式的NSQ的C++客户端库,支持消费者、生产者、服务发现等特性。详情请见:evnsq readme
    将来还会推出redis的客户端库。

由来:

我们开发小组负责的业务需要用到TCP协议来建设长连接网关服务和一些其他的一些基于TCP的短连接服务,在调研开源项目的过程中,没有发现一个合适的库来满足我们要求。结合我们自身的业务情况,理想中的C++网络库应具备一下几个特性:

  • 接口简单易用,最好是C++接口
  • 多线程,也能支持多进程
  • 最好是基于libevent实现(因为现有的历史遗留框架、基础库等是依赖libevent),这样能很方便嵌入libevent的事件循环,否则改动较大或者集成起来的程序可能会有很多跨线程的调用

基于这些需要,可供选择的不多,所以我们只能自己开发一个。开发过程中,接口设计方面基本上大部分是参考muduo项目来设计和实现的,当然也做了一些取舍和增改;同时也大量借鉴了Golang的一些设计哲学和思想,举几个小例子来说明一下:

  1. Duration : 这是一个时间区间相关的类,自带时间单位信息,参考了Golang项目中的Duration实现。我们在其他项目中见到太多的时间是不带单位的,例如timeout,到底是秒、毫秒还是微秒?需要看文档说明或具体实现,好一点的设计会将单位带在变量名中,例如timeout_ms,但还是没有Duration这种独立的类好。目前C++11中也有类似的实现std::chrono::duration,但稍显复杂,没有咱们这个借鉴Golang实现的版本来的简单明了。
  2. Buffer : 这是一个缓冲区类,融合了muduo和Golang两个项目中相关类的设计和实现
  3. http::Server : 这是一个http服务器类,自带线程池,它的事件循环和工作线程调度,完全是线程安全的,业务层不用太多关心跨线程调用问题。同时,还将http服务器的核心功能单独抽取出来形成
  4. http::Service类,是一个可嵌入型的服务器类,可以嵌入到已有的libevent事件循环中。
    网络地址的表达就仅仅使用"ip:port"这种形式字符串表示,就是参考Golang的设计
  5. httpc::ConnPool是一个http的客户端连接池库,设计上尽量考虑高性能和复用。以后基于此还可以增加负载均衡和故障转移等特性。

另外,我们实现过程中极其重视线程安全问题,一个事件相关的资源必须在其所属的EventLoop中初始化和析构释放,这样我们能最大限度的减少出错的可能。为了达到这个目标我们重载event_add和event_del等函数,每一次调用event_add,就在对应的线程私有数据中记录该对象,在调用event_del时,检查之前该线程私有数据中是否拥有该对象,然后在整个程序退出前,再完整的检查所有线程的私有数据,看看是否仍然有对象没有析构释放,详细代码实现可以参考 https://github.com/Qihoo360/evpp/blob/master/evpp/inner_pre.cc#L46~L87。我们如此苛刻的追求线程安全,只是为了让一个程序能安静的平稳的退出或Reload,因为我们深刻的理解“编写永远运行的系统,和编写运行一段时间后平静关闭的系统是两码事”,后者要困难的多。

http://www.oschina.net/p/evpp

时间: 2024-10-11 00:03:50

基于 libevent 开发的 C++ 11 高性能网络服务器 evpp的相关文章

基于Java的高性能基金持仓分析服务器开发

基于Java的高性能基金持仓分析服务器开发(Java多线程\SOCKET编程\JAVA高并发) http://www.ibeifeng.com/goods-260.html 咨询QQ2110053820 课程讲师:hejing 课程分类:Java基础 适合人群:中级 课时数量:30课时 更新程度:完毕 用到技术:Java多线程.SOCKET编程.ant编译.poi组件 涉及项目:基金持仓分析服务器 本课程是一套采用JAVA开发大并发.高性能服务器系统的视频教程,此教程从头到 尾采用高性能基金持仓

基于iDRAC开发全新接口,用于获取服务器更详细的信息(适用于dell服务器,其他服务器未测试)

github地址 https://github.com/zhangliu520/pyidrac pyidrac 由于ipmi 获取服务器硬件信息不够全面,于是自己基于iDRAC开发全新接口.idrac服务器详细信息获取获取数据包括(电池,mac地址,内核详情,cpu详情,内存详情,磁盘详情,系统名,操作系统类型等等)其它数据待开发. 使用范围 适用于dell服务器,其他服务器资产信息待测定.我会不断的更新bug. python版本 python2,python3 使用说明 安装 pip inst

PostgreSQL 优势,MySQL 数据库自身的特性并不十分丰富,触发器和存储过程的支持较弱,Greenplum、AWS 的 Redshift 等都是基于 PostgreSQL 开发的

PostgreSQL 优势 2016-10-20 21:36 686人阅读 评论(0) 收藏 举报  分类: MYSQL数据库(5)  PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),功能很强大.包括了可以说是目前世界上最丰富的数据类型的支持,比如 IP 类型和几何类型等等. 发现很多读者都问过这样一个问题:如果打算为项目选择一款免费.开源的数据库,那么你可能会在MySQL与PostgreSQL之间犹豫不定.针对这个问题,我们采访到了即将在Postgres中国用户20

谈谈如何使用Netty开发实现高性能的RPC服务器

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道调用细节的前提之下,调用远程计算机上运行的某个对象,使用起来就像调用本地的对象一样.目前典型的RPC实现框架有:Thrift(facebook开源).Dubbo(alibaba开源)等等.RPC框架针对网络协议.网络I/O模型的封装是透明的,对于调用的客户端而言,它就认为自己在调用本地的一个对象.至

一些基于jQuery开发的控件

基于jQuery开发,非常简单的水平方向折叠控件.主页:http://letmehaveblog.blogspot.com/2007/10/haccordion-simple-horizontal-accordion.html (无法找到)下载:http://letmehaveblog.blogspot.com/2007/10/haccordion-simple-horizontal-accordion.html 示例:http://letmehaveblog.blogspot.com/2007

Netty开发实现高性能的RPC服务器

Netty开发实现高性能的RPC服务器 RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道调用细节的前提之下,调用远程计算机上运行的某个对象,使用起来就像调用本地的对象一样.目前典型的RPC实现框架有:Thrift(facebook开源).Dubbo(alibaba开源)等等.RPC框架针对网络协议.网络I/O模型的封装是透明的,对于调用的客户端而

Pure-FTPd实现基于虚拟帐号访问的FTP服务器

Pure-FTPd是一个免费的(BSD),安全的,符合标准的FTP服务器.它可以基于web页面进行管理,管理起来非常方便和高效:同时,它支持虚拟用户进行访问,大大提高了它的安全性.它提供了共同的需求,简单的答案,再加上独特的有用的功能,为个人用户和主机提供商. Pure-FTPd可以支持多种操作系统(Linux, OpenBSD, NetBSD, DragonflyBSD FreeBSD, Solaris, Tru64,Darwin, Irix,HPUX,AIXand iPhone.),支持多种

个人知识管理系统Version1.0开发记录(11)

关 键 字 搜 索 (1)匹配单个属性的关键字:(2)匹配单个对象的关键字:(3)匹配对象集合的关键字:(4)基于事件驱动的:(5)实时搜索,参考win7的搜索功能. 1.备份,java代码,数据库数据. 2.oracle数据库,用户操作. (1)查看数据库默认表空间. select * from database_properties;(2)创建用户create user 用户名 identified by 密码 默认表空间 临时表空间create user dyl identified by

自己动手,开发轻量级,高性能http服务器。

前言 http协议是互联网上使用最广泛的通讯协议了.web通讯也是基于http协议:对应c#开发者来说,asp.net core是最新的开发web应用平台.由于最近要开发一套人脸识别系统,对通讯效率的要求很高.虽然.net core对http处理很优化了,但是我决定开发一个轻量级http服务器:不求功能多强大,只求能满足需求,性能优越.本文以c#开发windows下http服务器为例. 经过多年的完善.优化,我积累了一个非常高效的网络库(参见我的文章:高性能通讯库).以此库为基础,开发一套轻量级