10行C++代码实现高性能HTTP服务

前言

是否是以为C++写个服务太累,但又沉迷于C++的真香性能而没法自拔?做为一个老牌C++程序员(能够看我 github 上十几年前的C++项目:https://github.com/kevwan ),这几天听一个好友跟我聊起他写的C++框架,说极简代码便可完成各类C++服务的开发,不由让我心生好奇!因而我去研究了一下,发现确实有点意思!linux

实战(干货)

话很少说,咱们来一块儿看看,10行C++代码怎么实现一个高性能的Http服务,轻松QPS几十万。Linus说:talk is cheap,show me the code ↓nginx

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

➜ 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行代码,咱们详细地解读:github

  1. 咱们选用 Http 协议,所以构造了一个WFHttpServer
  2. 一次网络交互就是一次任务,由于是 Http 协议,所以咱们是WFHttpTask
  3. 对server来讲,个人交互任务就是收到请求以后,填好回复,这些经过:task->get_req()task->get_resp()能够得到;
  4. 逻辑在一个函数中(即上面的 lambda),表示收到消息以后要作的事情,这里填了一句 “Hello World!”;
  5. Server启动和退出使用start()stop()两个简单的api,而中间要用getchar();卡住,是由于 workflow 是个纯异步的框架。

纯异步就是这个 Http 服务器的高性能所在:shell

  • 第一,多线程提供服务后端

    若是咱们收到请求以后在这个函数里作了一些阻塞的事情(好比等锁、io请求或者忙碌的计算等),那么再有用户请求个人时候,我就没有线程去处理新用户了api

  • 第二,网络线程和执行线程有优秀的调度策略服务器

    再多的线程也可能会有被霸占完的时候。咱们须要不管 server 函数想要作任何耗时的操做,都不会影响到网络线程微信

  • 第三,以 linux 为例,对epoll的封装高效好用

    若是服务只打算支持一万的QPS,其实底层怎么实现都很简单,但若是咱们但愿十万,甚至接近百万,则咱们对server底层作收发的I/O模型有很是高的要求

咱们来看看 workflow 是怎么来实现以上这些高并发能力:

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

以上是在同一台机器上用相同的变量作的 wrk 压测,具体能够到 github 查看机器配置、参数及压测工具代码。当数据长度保持不变,QPS 随着并发度提升而增大,后趋于平稳。此过程当中 workflow 一直有明显优点,高于 nginxbrpc。 特别是数据长度为64和512的两条曲线, 并发度足够的时候,能够保持50W的QPS。

总结

workflow 能在开源大半年在github上收获4k星星的承认,固然是除了简单高性能之外,还有其余许多的特色,若是你对其余使用场景还有所好奇,或者但愿尝试压测一下感觉高QPS带来的心跳加速,那么欢迎点击 workflow 的 github 猎奇更多脑洞大开的功能和用法。

项目地址

https://github.com/sogou/workflow

欢迎使用 workflowstar 支持一下!

微信交流

关注『微服务实践』公众号并回复 进群 获取微服务社区群二维码。

go-zero 系列文章见『微服务实践』公众号
相关文章
相关标签/搜索