Sogou C++ Workflow 高性能 C++ 服务器引擎开源项目

我要开发同款
匿名用户2020年09月03日
57阅读
所属分类C/C++、服务器软件、HTTP服务器
授权协议Apache-2.0

作品详情

SogouC++Workflow是搜狗公司的C++服务器引擎,支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务、云输入法与在线广告等,每日处理超百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数C++后端开发需求。

可以使用该项目:快速搭建http服务器:#include<stdio.h>#include"workflow/WFHttpServer.h"intmain(){WFHttpServerserver([](WFHttpTask*task){task->get_resp()->append_output_body("<html>HelloWorld!</html>");});if(server.start(8888)==0){//startserveronport8888getchar();//press"Enter"toend.server.stop();}return0;}作为万能异步客户端。目前支持http,redis,mysql和kafka协议。实现自定义协议client/server,构建自己的RPC系统。搜狗RPC就是以它为基础,作为独立项目开源。支持srpc,brpc和thrift等协议(benchmark)。构建异步任务流,支持常用的串并联,也支持更加复杂的DAG结构。作为并行编程工具使用。除了网络任务,我们也包含计算任务的调度。所有类型的任务都可以放入同一个流中。在Linux系统下作为文件异步IO工具使用,性能超过任何标准调用。磁盘IO也是一种任务。实现任何计算与通讯关系非常复杂的高性能高并发的后端服务。构建服务网格(servicemesh)系统。项目内置服务治理与负载均衡等功能。编译和运行环境项目支持Linux,macOS,Windows等操作系统。Windows版暂时以独立branch发布,使用iocp实现异步网络。用户接口与Linux版一致。支持所有CPU平台,包括32或64位x86处理器,大端或小端arm处理器。需要依赖于OpenSSL,推荐OpenSSL1.1及以上版本。项目使用了C++11标准,需要用支持C++11的编译器编译。但不依赖boost或asio。项目无其它依赖,但是包含了lz4,zstd和snappy几个压缩库的无改动源代码(kafka协议需要)。系统设计特点

典型后端服务器由以下三个部分组成,并且完全独立开发。

协议大多数情况下,用户使用的是内置的通用网络协议,例如http,redis或各种rpc。用户可以方便的自定义网络协议,只需提供序列化和反序列化函数,就可以定义出自己的client/server。算法在SogouC++Workflow的设计里,算法是与协议对称的概念。如果说协议的调用是rpc,算法的调用就是一次apc(AsyncProcedureCall)。提供了一些通用算法,例如sort,merge,psort,reduce,可以直接使用。与自定义协议相比,自定义算法的使用要常见得多。任何一次边界清晰的复杂计算,都应该包装成算法。任务流任务流就是实际的业务逻辑,就是把开发好的协议与算法放在流程图里使用起来。典型的任务流是一个闭合的串并联图。复杂的业务逻辑,可能是一个非闭合的DAG。任务流图可以直接构建,也可以根据每一步的结果动态生成。所有任务都是异步执行的。

基础任务,任务工厂与复合任务

系统中包含六种基础任务:通讯,文件IO,CPU,GPU,定时器,计数器。一切任务都由任务工厂产生,并且在callback之后自动回收。server任务是一种特殊的通讯任务,由框架调用任务工厂产生,通过process函数交给用户。大多数情况下,用户通过任务工厂产生的任务,都是一个复合任务,但用户并不感知。例如,一次http请求,可能包含许多次异步过程(DNS,重定向),但对用户来讲,就是一次通信任务。文件排序,看起来就是一个算法,但其实包括复杂的文件IO与CPU计算的交互过程。如果把业务逻辑想象成用设计好的电子元件搭建电路,那么每个电子元件内部可能又是一个复杂电路。

异步性和基于C++11std::function的封装

不是基于用户态协程。使用者需要知道自己在写异步程序。一切调用都是异步执行,几乎不存在占着线程等待的操作。虽然我们也提供一些便利的半同步接口,但并不是核心的功能。尽量避免派生,以std::function封装用户行为,包括:任何任务的callback。任何server的process。符合FaaS(FunctionasaService)思想。一个算法的实现,简单来讲也是一个std::function。但算法也可以用派生实现。

内存回收机制

任何任务都会在callback之后被自动内存回收。如果创建的任务不想运行,则需要通过dismiss方法释放。任务中的数据,例如网络请求的resp,也会随着任务被回收。此时用户可通过std::move()把需要的数据移走。SeriesWork和ParallelWork是两种框架对象,同样在callback之后被回收。项目中不使用std::shared_ptr来管理内存。
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论