查看原文
其他

(文末有母亲节抽奖活动)Sogou C++ Workflow 开源

The following article is from 开发内功修炼 Author 张彦飞allen

今天我来为大伙介绍一下我们搜狗的最新官方开源力作 - Sogou C++ Workflow !

Sogou Workflow是一款性能优异的网络框架。开源短短几个月,就斩获了 3.6k 的 star。在搜狗内部,几乎所有的 C++ 后端服务,包含但不限于搜索,输入法,广告等都是基于这个框架,每天处理超过百亿的请求,它是一个已经经过多年线上考验的工业级框架。开源以后,在业界也已经有十多家公司进行了实际应用。

Github地址:https://github.com/sogou/workflow

我们来看看这款新的网络框架到底都有哪些优势。

先来看服务器端

在服务器领域,我们拿最常见的应用场景,HTTP Server 来举例。如果用 workflow,我们可以像 Go 一样几行代码就轻松写出一个 HTTP 服务器。如下:

void process(WFHttpTask *server_task)
{
 server_task->get_resp()->append_output_body("Hello World!");
}

int main(int argc, char *argv[])
{
 ...
 WFHttpServer server(process);
 if(server.start(8888) == 0){
  server.stop();
 }
 return 0;
}

完整源码参见:https://github.com/sogou/workflow/blob/master/docs/tutorial-04-http_echo_server.md

可见,workflow 屏蔽了所有的底层概念,例如IO线程,工作线程,任务队列和超时处理等等。为开发者提供了一个简洁到极致的开发方式,使用起来非常的简单。

那么这个基于 HTTP 服务器的性能咋样呢?我把官网里的对比实验结果搬出来。

  • 测试环境:CPU 40 core @ 2.20GHz,内存192G,网卡25000Mb/s
  • 线程数
    • workflow:将使用 16 个 poller 线程和 20 个 handler 线程
    • nginx:40 个 Worker 进程
    • brpc:40 个 线程
  • 数据长度:分别设置为 64、512 和 4096
  • 并发度:在[1, 2K]之间翻倍增长

我们看下实际的实验结果:

特别是数据长度为64和512的两条曲线,并发度足够的时候,可以保持500K的QPS。

再看客户端优化

我们都知道阻塞网络 IO 是高性能服务器开发的绊脚石。虽然很多网络框架比如 libevent 里已经有非常高效的非阻塞解决方案,但是由于 C++ 缺乏像 Golang 一样统一的网络 IO 封装,总会有出现一些“漏网之鱼”。

比如说当你的 C++ Server 需要 访问 mysql 的时候,在 workflow 出现之前,一般就是选择传统的 mysql 客户端。传统客户端的特点就是一个用户线程以同步阻塞的方式等待连接上的数据。而我们的服务器是要处理很多用户的请求的,这就不得已需要创建很多的线程才行。除了引入额外的创建成本不说,频繁的上下文切换将带来大量无谓的 CPU 开销。

类似的还有 http、redis 和 kafka 客户端。只要用到它们,就又会将自己精心优化过的服务拖回到阻塞的低性能泥潭中。

鉴于业务的这个痛点,workflow 自己实现了纯异步的多种客户端。这些作为客户端角色的网络 socket 也和接收到的用户连接一起,统一交给 poller 线程进行高效的非阻塞 IO 管理。进而大大提升了 Server 作为客户端请求数据需求时的性能表现。

而且使用起来也是非常的简单方便,拿 mysql 来举例:

//在回调函数这里完成对返回结果的处理
void mysql_callback(WFMySQLTask *task)
{
 ...
}
int main(int argc, char *argv[])
{
 ...
 task = WFTaskFactory::create_mysql_task(url, RETRY_MAX, mysql_callback);
 task->get_req()->set_query("show databases");
 task->start();
 ...
}

完整源码参见:https://github.com/sogou/workflow/blob/master/docs/tutorial-12-mysql_cli.md

简单的几行,就能够提交一个异步的MySQL任务。从此以后,再也不用担心传统客户端拖垮你的性能了。在合理的配置下,单机每秒能处理几万次MySQL请求。

还有哪些特性?

作为一个搜狗公司的通用的基础设施, workflow 除了具备网络框架的高性能封装以外。还有其他很多特色。

1、友好的用户体验
workflow 给开发者用户接触到的是task(任务)和series(任务流)。这个高度的抽象使得开发可以聚集所有精力完成应用逻辑的开发,完全不需要考虑线程等底层概念。

2、通信与计算一体
大部分的 C++ 框架着重只解决网络 IO 的效率问题,而计算与任务调度框架需要用户自己实现。workflow 框架则将二者融为一体,一并解决了。Workflow 自动对任务进行调度,并且打通了网络、磁盘等等其他资源。

3、完善的文档和 demo
不同于许多为了开源而开源的 kpi 项目,workflow 配备了完整的文档和 demo。非常的易于上手,而且遇到问题时还有技术支持 QQ群(群号:618773193)。

项目地址:https://github.com/sogou/workflow

赶紧先 star 上,不要错过了!


福利时间


母亲节来了,为了感谢各位读者的支持,本公众号特地抽奖赠送 10 名价值 325 元每年的小方说服务器开发知识星球免费名额,小方说服务器知识星球为读者提供为期一年的如下五大服务:
1 优问优答
2 不定期的技术直播和录像
3 优质源码分享和指导
4 职业解惑和简历review 
5 十二大专栏
更多关于小方说服务器开发知识星球介绍参见这里


参与方法:


加我微信 easy_coder 拉你进抽奖群(仅针对新加我的小伙伴哦,所以中奖几率更大)。


点赞、在看少个bug

      您可能也对以下帖子感兴趣

      文章有问题?点此查看未经处理的缓存