今天给大家推荐搜狗一个开源项目
GitHub - sogou/workflow: C++ Parallel Computing and Asynchronous Networking Engine
这个其实是一个赋能C++/C后端工程师的高科技产品,以后我们就不需要自己造轮子就可以享受到大厂一样牛逼稳定的后端服务。
我们今天就从三个部分来展开,一、安装和入门 二、做一个web服务 三、测评
一、安装和入门
预备安装一些必要的包
yum install git cmake cmake3 openssl-devel gcc-c++
下载源码
git clone GitHub - pennyliang/workflow: Sogou framework for C++ backend development.
编译安装
cd /workflow/
./configure
make
make install
4) 编译和运行第一个代码
在tutorial 目录下找到样例代码 tutorial-04-
用下面命令直接编译
g++ -std=c++11 -I /opt/sogou/include/ -o tutorial-04-http_echo_server tutorial-04- /opt/sogou/lib64/libworkflow.a -lssl -lpthread -lcrypto
也可以直接在tutourial目录下运行make编译,上面这个编译命令方便你以后在自己的项目中编译。
运行这段代码(让这个服务开在9090端口上)
./tutorial-04-http_echo_server 9090
在这台机器上在运行,就可以看到正常工作了
curl "http://127.0.0.1:8080/index.html"
到这一步,基本上可以算是最低代价把这个东西算跑起来了。
二、制作一个http web 服务
我在用C++自制了一个类似的web服务,用于跑pullword分词服务,这样的好处全是C代码,比较方便和我写的数据库联合编译,调试也方便。因为有了这个我尝试用这个来改造我的分词代码。
改动非常小。我这里只记录几个重要的改动。
只改了两个文件,一个是main文件,这个主要参考tutorial-04-,其中有一个设置比较重要 settings.handler_threads = 10; 这个控制工作线程的数量,不超过CPU核的2倍比较好,如果有大量IO操作,可以适当提高倍数。
另一部分就是改工作线程的回调函数,这部分改动就大了,依次如下
取request的部分
我们知道如果request的内容很大,http协议会分包,这部分这个框架已经做好了,不用考虑。protocol::HttpRequest *req = server_task->get_req(); 这个函数返回就表明所有的request的字符串都接收完整了。
2)发送数据
protocol::HttpResponse *resp = server_task->get_resp();
server_task->set_send_timeout(3*1000) ;
resp->set_http_version("HTTP/1.1");
resp->set_status_code("200");
resp->set_reason_phrase("OK");
resp->add_header_pair("Content-Type", "text/json;;charset=UTF-8");
resp->add_header_pair("Server", "Sogou WFHttpServer");
resp->append_output_body(bufs,read);
这里面值得说的是函数append_output_body,第一个参数是插入发送缓存的数据,read是插入发送缓存的这段缓存bufs的长度。这个函数方便之处是可以多次调用,不断追加的方式写。
程序返回后,系统会自动按照3秒超时的约定把数据发射出去。如果需要对超时需要使用set_callback函数,详见http proxy那个tutorial例子。
三、测评
因为我这个分词服务没法运行在apache和Nginx上,我只能用这个和我自制的去比,手段也比较有限。
以下是测评结果
在小并发情况下,我自制的webserver和workflow做webserver差不多,没有显著区别。并发的情况下,我这个自制的服务很不稳定,超时错误的时大时掉,失败数有时可达3000多,表格上取了几次的平均值。搜狗基本在小几百。我自制的webserver还多次被打卦,搜狗的workflow表现稳定。