今天给大家推荐搜狗一个开源项目
今天给大家推荐搜狗一个开源项目
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-http_echo_server.cc
用下面命令直接编译
g++ -std=c++11 -I /opt/sogou/include/ -o tutorial-04-http_echo_server tutorial-04-http_echo_server.cc /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 服务
我在2014年用C++自制了一个类似的web服务,用于跑pullword分词服务,这样的好处全是C代码,比较方便和我写的数据库联合编译,调试也方便。因为有了这个我尝试用这个来改造我的分词代码。
改动非常小。我这里只记录几个重要的改动。
只改了两个文件,一个是main文件,这个主要参考tutorial-04-http_echo_server.cc,其中有一个设置比较重要 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上,我只能用这个和我自制的去比,手段也比较有限。
以下是测评结果
分词服务测试 |
|||||||||
workflow(10线程) |
自制(10线程) |
||||||||
任务数 |
并发数 |
QPS |
失败数 |
任务数 |
并发数 |
QPS |
失败数 |
||
1000 |
5 |
718 |
3 |
1000 |
5 |
717 |
0 |
||
1000 |
6 |
696 |
0 |
1000 |
6 |
743 |
0 |
||
1000 |
7 |
718 |
0 |
1000 |
7 |
757 |
0 |
||
1000 |
8 |
727 |
1 |
1000 |
8 |
764 |
0 |
||
1000 |
9 |
721 |
0 |
1000 |
9 |
763 |
0 |
||
1000 |
10 |
726 |
0 |
1000 |
10 |
779 |
0 |
||
1000 |
15 |
703 |
0 |
1000 |
15 |
789 |
0 |
||
1000 |
20 |
754 |
0 |
1000 |
20 |
798 |
6 |
||
1000 |
25 |
756 |
9 |
1000 |
25 |
786 |
6 |
||
10000 |
25 |
754 |
182 |
10000 |
25 |
929 |
606 |
||
在小并发情况下,我自制的webserver和workflow做webserver差不多,没有显著区别。并发的情况下,我这个自制的服务很不稳定,超时错误的时大时掉,失败数有时可达3000多,表格上取了几次的平均值。搜狗基本在小几百。我自制的webserver还多次被打卦,搜狗的workflow表现稳定。
今天给大家推荐搜狗一个开源项目相关推荐
- 看腻了数字,拼图验证码?推荐一个开源项目——把验证码设计成射击游戏
一.导读 生活中我们见到的大多数验证方式都是以下这样的: 这些都太普通了,可不可以用小游戏来验证呢? 今天在GitHub上看到一个开源项目--doom captcha 二.效果预览 作者非常有创意的将 ...
- [征询意见][投票]先集中力量做好一个开源项目
最近一直考虑在博客园组织开源项目的开发,我觉得发挥社区力量做出成功的开源项目是社区价值的体现.虽然组织开源项目的难度很大,也有过失败的教训,但只有实际地去做,去真正地面对挑战,才有成功的可能,否则,只 ...
- 推荐一些国产开源项目
推荐一些国产开源项目 Easyjf Easyjf是一个国产的开源社区,开源项目众多,都做的一般般,但是要支持下! http://www.easyjf.com/ 精仿DZ论坛 LForum 写在前面 ...
- 如何开始做一个开源项目?他的亲身经历值得参考
(点击上方公众号,可快速关注) 英文:Vincent Voyer,翻译:Linux爱好者 - nEoYe [导读]:作者 Vincent Voyer 用亲身经历鼓励大家从事开源活动:他在 Nodejs ...
- 「开眼」,让你非常开眼的一个开源项目
[公众号回复 "1024",免费领取程序员赚钱实操经验] 大家好,我是章鱼猫.今天给大家推荐的这个开源项目,来自于原作者的毛遂自荐,作者向我们投稿,所以,如果你身边也有好的开源项目 ...
- 如何从0开始参与一个开源项目?
今天我准备和你详细介绍如何开始参与开源项目,帮助你在 GitHub 上完成第一个 PR 的合入. 当然,除了正常的 PR 合入流程之外,我还准备详细介绍一下如果一个 PR 提交后遇到了冲突.需要追加 ...
- 如何做好一个开源项目之徽章(二)
在上一篇[如何做好一个开源项目(一)],笔者已经介绍过开源项目运作和维护的一些理念了,本篇开始,笔者将着重于介绍一些开源项目维护过程中的一些细节,比如徽章.构建等等.由于最近经常出差,所以博客有中断, ...
- 如何做好一个开源项目(一)
做好一个开源项目其实是一件比较费时费力费心的工作,它的最大难点除了代码维护之外,还包括后期的维护和持续的跟进.我曾经做过不少开源项目,但是坚持下来的,目前有信心能够持续维护的也只有Magicodes. ...
- 开源项目贡献者_我如何从一名贡献者转变为一个开源项目维护者
开源项目贡献者 by Dhanraj Acharya 通过Dhanraj Acharya 我如何从一名贡献者转变为一个开源项目维护者 (How I went from being a contribu ...
最新文章
- AngularJS之Service(四)
- 数据类型,运算符和表达式03 - 零基础入门学习C语言04
- adf4351_使用ADF BC管理保存点
- com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0
- 使用@Configuration注解来代替Spring的bean配置
- Spark加载hadoop配置原理
- Thread Join 讲解
- 只能选择分卷文件的第一部分。_为机器学习模型选择正确的度量评估(第一部分)...
- 信息学奥赛一本通(1006:A+B问题)
- Java Map在遍历过程中删除元素
- SparkSQL UDF使用方法与原理详解
- 实战RxSwift中的Observable, subscribe, dispose, filter
- 安卓开发 监听系统语言切换
- 输电线路覆冰智能预测预警系统
- AMD CPU 运行 Android Studio 原生模拟器的几点注意事项
- LaTeX第一课:MiKTeX+Texmaker安装
- linux系统中网关ip修改设置命令大全
- HTML+CSS实现网页分页页码
- 雾霾太重?深度神经网络教你如何图像去雾
- h264 sei信息 解码_关于H264编码数据中SPS,PPS,SEI,IDR等内容的问题