10行C++代码实现高性能HTTP服务
前言
是不是觉得C++写个服务太累,但又沉迷于C++的真香性能而无法自拔?作为一个老牌C++程序员(可以看我 github 上十几年前的C++项目:https://github.com/kevwan ),这几天听一个好友跟我聊起他写的C++框架,说极简代码即可完成各种C++服务的开发,不禁让我心生好奇!于是我去研究了一下,发现确实有点意思!
实战(干货)
话不多说,我们来一起看看,10行C++代码怎么实现一个高性能的Http服务,轻松QPS几十万。Linus说:talk is cheap,show me the code ↓
int main() {
WFHttpServer server([](WFHttpTask *task) {
task->get_resp()->append_output_body("Hello World!");
});
if (server.start(8888) == 0) {
getchar(); // press "Enter" to end.
server.stop();
}
return 0;
}
这个 server 使用了 workflow,安装编译都非常简单,以 Linux 为例,把代码拉下来后,一行命令即搞定编译:
➜ git clone https://github.com/sogou/workflow
➜ cd workflow
➜ make
➜ cd tutorial
➜ make
➜ ./helloworld
代码在 tutorial 目录,编译后的 helloworld 可以直接运行,侦听在 8888 端口,curl 即可访问:
➜ curl -i http://localhost:8888
HTTP/1.1 200 OK
Content-Length: 25
Connection: Keep-Alive
Hello World!
伴随着以上这10行代码,我们详细地解读:
- 我们选用 Http 协议,因此构造了一个
WFHttpServer; - 一次网络交互就是一次任务,因为是 Http 协议,因此我们是
WFHttpTask; - 对server来说,我的交互任务就是收到请求之后,填好回复,这些通过:
task->get_req()和task->get_resp()可以获得; - 逻辑在一个函数中(即上面的 lambda),表示收到消息之后要做的事情,这里填了一句 “Hello World!”;
- Server启动和退出使用
start()和stop()两个简单的api,而中间要用getchar();卡住,是因为 workflow 是个纯异步的框架。
纯异步就是这个 Http 服务器的高性能所在:
第一,多线程提供服务
如果我们收到请求之后在这个函数里做了一些阻塞的事情(比如等锁、io请求或者忙碌的计算等),那么再有用户请求我的时候,我就没有线程去处理新用户了
第二,网络线程和执行线程有优秀的调度策略
再多的线程也可能会有被霸占完的时候。我们需要无论 server 函数想要做任何耗时的操作,都不会影响到网络线程
第三,以 linux 为例,对epoll的封装高效好用
如果服务只打算支持一万的QPS,其实底层怎么实现都很简单,但如果我们希望十万,甚至接近百万,则我们对server底层做收发的I/O模型有非常高的要求
我们来看看 workflow 是怎么来实现以上这些高并发能力:

基于以上的架构,基于 workflow 的 server 轻轻松松就可以达到几十万 QPS,高吞吐、低成本、开发快,完美支撑了搜狗的所有后端在线服务!详细代码实现请参考 workflow 源码。然后我们以数据说话,通过跟名誉全球的高性能 Http 服务器 nginx 和国内开源框架先驱 brpc 一起做比较,看一下固定数据长度下 QPS 与并发度的关系:

以上是在同一台机器上用相同的变量做的 wrk 压测,具体可以到 github 查看机器配置、参数及压测工具代码。当数据长度保持不变,QPS 随着并发度提高而增大,后趋于平稳。此过程中 workflow 一直有明显优势,高于 nginx 和 brpc。 特别是数据长度为64和512的两条曲线, 并发度足够的时候,可以保持50W的QPS。
总结
workflow 能在开源大半年在github上收获4k星星的认可,当然是除了简单和高性能以外,还有其他许多的特点,如果你对其他使用场景还有所好奇,或者希望尝试压测一下感受高QPS带来的心跳加速,那么欢迎点击 workflow 的 github 猎奇更多脑洞大开的功能和用法。
项目地址
https://github.com/sogou/workflow
欢迎使用 workflow 并 star 支持一下!
微信交流
关注『微服务实践』公众号并回复 进群 获取微服务社区群二维码。
10行C++代码实现高性能HTTP服务的更多相关文章
- 10 行 Python 代码实现模糊查询/智能提示
10 行 Python 代码实现模糊查询/智能提示 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的 ...
- 10行Python代码计算汽车数量
当你还是个孩子坐车旅行的时候,你玩过数经过的汽车的数目的游戏吗? 在这篇文章中,我将教你如何使用10行Python代码构建自己的汽车计数程序. 以下是环境及相应的版本库: Python版本 3.6.9 ...
- 10 行 Python 代码,批量压缩图片 500 张,简直太强大了
本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/5hpFDgjCpfb0O1Jg-ycACw 熟悉 "Pyth ...
- 10 行 Python 代码写的模糊查询
导语: 模糊匹配可以算是现代编辑器(在选择要打开的文件时)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列表供用户选择. 样例如下: Vim (Ctrl-P ...
- 10行Python代码实现人脸定位
10行python机器学习全卷机网,实现100+张人脸同时定位! 发表评论 1,049 游览 A+ 所属分类:未分类 收 藏 今天介绍一个快速定位人脸的深度学习算法MTCNN,全称是:Multi-t ...
- 10行Python代码实现目标检测
要知道图像中的目标是什么? 或者你想数一幅图里有多少个苹果? 在本文中,我将向你展示如何使用Python在不到10行代码中创建自己的目标检测程序. 如果尚未安装python库,你需要安装以下pytho ...
- 10行Python代码解决约瑟夫环(模拟)
http://blog.csdn.net/dengyaolongacmblog/article/details/39208675 #!/usr/bin/env python # coding: utf ...
- 10行Python代码自动清理电脑内重复文件,解放双手!
大家好,又到了Python办公自动化系列. 今天分享一个系统层面的自动化案例: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...
- 10行Java代码实现最近被使用(LRU)缓存
在最近的面试中,我曾被多次问到,怎么实现一个最近最少使用(LRU)的缓存.缓存可以通过哈希表来实现,然而为这个缓存增加大小限制会变成另一个有意思的问题.现在我们看一下怎么实现. 最近最少使用缓存的回收 ...
随机推荐
- list.add(int index, E element)和list.addAll(list1)
List.add(int index, E element): 在列表的指定位置插入指定元素(可选操作).将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(在其索引中加 1). 参数:ind ...
- 读懂RESTful风格
RESTful就是资源定位和资源操作的风格.不是标准也不是协议. REST即Representational State Transfer的缩写,可译为"表现层状态转化".REST ...
- 免费的图片校正及漂白专业工具PicGrayRemover 0.96,专业去除文档图片黑底麻点杂色,还你一个清晰的文本。
当家长多年,每天都要拍照试卷打印.用App去掉图片黑底就成了每天必备工作.可是,有些图片文件不是来自手机,所以需要一个电脑版的图片漂白工具. 因此,经过几周的努力,图片漂白工具 PicGrayRemo ...
- 第41天学习打卡(死锁 Lock synchronized与Lock的对比 线程协作 使用线程池)
死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有"两个以上对象的锁"时 ...
- Linux磁盘分区格式化和扩容
Note:根据各系统上磁盘的类型不同,磁盘命名规则也会不同:例如/dev/xvd,/dev/sd,/dev/vd,/dev/hd 目录 磁盘格式化 MBR格式 GPT分区 磁盘扩容 MBR格式扩容 G ...
- Java 常见对象 05
常见对象·正则表达式 和 其他类 正则表达式的概述和简单使用 * A:正则表达式 * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则,有自己的特殊应用 * 作用: ...
- Python工程师学习之旅
1.Python软件开发基础 1.Linux操作系统2.Docker基础3.Python基础语法4.Python字符串解析5.Python正则表达式6.Python文件操作7.Python 模块8.P ...
- 任务3 PHP配置 1. PHP基础配置
查看PHP配置文件得位置 #/ucsr/local/php/bin/php -i |grep -i "loaded configuration file" # cp /usr/lo ...
- 来,Consul 服务发现入个门(一看就会的那种)
前言 在微服务架构中,对于一个系统,会划分出多个微服务,而且都是独立开发.独立部署,最后聚合在一起形成一个系统提供服务.当服务数量增多时,这些小服务怎么管理?调用方又怎么能确定服务的IP和端口?服务挂 ...
- ajax轮询原理及其实现方式
ajax轮询原理及其实现方式 ajax轮询的两种方式 方式1:设定一个定时器,无论有无结果返回,时间一到就会继续发起请求,这种轮询耗费资源,也不一定能得到想要的数据,这样的轮询是不推荐的. 方式2: ...