是不是觉得 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("<html>Hello World!</html>");
});
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
<html>Hello World!</html>
伴随着以上这 10 行代码,我们详细地解读:
WFHttpServer
;WFHttpTask
;task->get_req()
和task->get_resp()
可以获得;start()
和stop()
两个简单的 api,而中间要用 getchar()
卡住,是因为 workflow 是个纯异步的框架。纯异步就是这个 Http 服务器的高性能所在:
我们来看看 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元无门槛券
私享最新 技术干货