如果觉得写的可以,请给一个点赞+关注支持一下
搜狗公司C++服务器引擎,编程范式。支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务,云输入法,在线广告等,每日处理数百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数后端与嵌入式开发需求。
workflow使用场景:
- 快速搭建http服务器:
- 作为万能异步客户端。目前支持
http
,redis
,mysql
和kafka
协议。- 轻松构建效率极高的spider。
- 实现自定义协议client/server,构建自己的RPC系统。
- srpc就是以它为基础,作为独立项目开源。支持
srpc
,brpc
,trpc
和thrift
等协议。
- srpc就是以它为基础,作为独立项目开源。支持
- 构建异步任务流,支持常用的串并联,也支持更加复杂的DAG结构。
- 作为并行计算工具使用。除了网络任务,我们也包含计算任务的调度。所有类型的任务都可以放入同一个流中。
- 在
Linux
系统下作为文件异步IO工具使用,性能超过任何标准调用。磁盘IO也是一种任务。 - 实现任何计算与通讯关系非常复杂的高性能高并发的后端服务。
- 构建微服务系统。
- 项目内置服务治理与负载均衡等功能。
编译和运行环境
- 项目支持
Linux
,macOS
,Windows
,Android
等操作系统。Windows
版以windows分支发布,使用iocp
实现异步网络。用户接口与Linux
版一致。
- 支持所有CPU平台,包括32或64位
x86
处理器,大端或小端arm
处理器,国产loongson
龙芯处理器实测支持。 - 需要依赖于
OpenSSL
,推荐OpenSSL 1.1
及以上版本。- 不喜欢SSL的用户可以使用nossl分支,代码更简洁。
- 项目使用了
C++11
标准,需要用支持C++11
的编译器编译。但不依赖boost
或asio
。 - 项目无其它依赖。如需使用
kafka
协议,需自行安装lz4
,zstd
和snappy
几个压缩库。
git clone https://github.com/sogou/workflow # From gitee: git clone https://gitee.com/sogou/workflow
cd workflow
make
cd tutorial
make
编程范式
结构化并发与任务隐藏
- 我们系统中包含五种基础任务:通讯,计算,文件IO,定时器,计数器。
- 一切任务都由任务工厂产生,用户通过调用接口组织并发结构。例如串联并联,DAG等。
- 大多数情况下,用户通过任务工厂产生的任务,都隐藏了多个异步过程,但用户并不感知。
- 例如,一次http请求,可能包含许多次异步过程(DNS,重定向),但对用户来讲,就是一次通信任务。
- 文件排序,看起来就是一个算法,但其实包括复杂的文件IO与CPU计算的交互过程。
- 如果把业务逻辑想象成用设计好的电子元件搭建电路,那么每个电子元件内部可能又是一个复杂电路。
- 任务隐藏机制大幅减少了用户需要创建的任务数量和回调深度。
- 任何任务都运行在某个串行流(series)里,共享series上下文,让异步任务之间数据传递变得简单。
回调与内存回收机制
- 一切调用都是异步执行,几乎不存在占着线程等待的操作。
- 显式的回调机制。用户清楚自己在写异步程序。
- 通过一套对象生命周期机制,大幅简化异步程序的内存管理
- 任何框架创建的任务,生命周期都是从创建到callback函数运行结束为止。没有泄漏风险。
- 如果创建了任务之后不想运行,则需要通过dismiss()接口删除。
- 任务中的数据,例如网络请求的resp,也会随着任务被回收。此时用户可通过
std::move()
把需要的数据移走。 - 项目中不使用任何智能指针来管理内存。代码观感清新。
- 任何框架创建的任务,生命周期都是从创建到callback函数运行结束为止。没有泄漏风险。
- 尽量避免用户级别派生,以std::function封装用户行为,包括:
- 任何任务的callback。
- 任何server的process。符合
FaaS
(Function as a Service)思想。 - 一个算法的实现,简单来讲也是一个
std::function
。 - 如果深入使用,又会发现一切皆可派生。