当前位置: 首页 > 软件库 > 服务器软件 > HTTP服务器 >

Sogou C++ Workflow

高性能 C++ 服务器引擎
授权协议 Apache-2.0
开发语言 C/C++
所属分类 服务器软件、 HTTP服务器
软件类型 开源软件
地区 国产
投 递 者 海景曜
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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

可以使用该项目:

  • 快速搭建http服务器:
#include <stdio.h>
#include "workflow/WFHttpServer.h"

int main()
{
    WFHttpServer server([](WFHttpTask *task) {
        task->get_resp()->append_output_body("<html>Hello World!</html>");
    });

    if (server.start(8888) == 0) {  // start server on port 8888
        getchar(); // press "Enter" to end.
        server.stop();
    }

    return 0;
}
  • 作为万能异步客户端。目前支持httpredismysqlkafka协议。
  • 实现自定义协议client/server,构建自己的RPC系统。
    • 搜狗RPC就是以它为基础,作为独立项目开源。支持srpcbrpcthrift等协议(benchmark)。
  • 构建异步任务流,支持常用的串并联,也支持更加复杂的DAG结构。
  • 作为并行编程工具使用。除了网络任务,我们也包含计算任务的调度。所有类型的任务都可以放入同一个流中。
  • Linux系统下作为文件异步IO工具使用,性能超过任何标准调用。磁盘IO也是一种任务。
  • 实现任何计算与通讯关系非常复杂的高性能高并发的后端服务。
  • 构建服务网格(service mesh)系统。
    • 项目内置服务治理与负载均衡等功能。

编译和运行环境

  • 项目支持LinuxmacOSWindows等操作系统。
    • Windows版暂时以独立branch发布,使用iocp实现异步网络。用户接口与Linux版一致。
  • 支持所有CPU平台,包括32或64位x86处理器,大端或小端arm处理器。
  • 需要依赖于OpenSSL,推荐OpenSSL 1.1及以上版本。
  • 项目使用了C++11标准,需要用支持C++11的编译器编译。但不依赖boostasio
  • 项目无其它依赖,但是包含了lz4zstdsnappy几个压缩库的无改动源代码(kafka协议需要)。

系统设计特点

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

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

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

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

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

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

内存回收机制

  • 任何任务都会在callback之后被自动内存回收。如果创建的任务不想运行,则需要通过dismiss方法释放。
  • 任务中的数据,例如网络请求的resp,也会随着任务被回收。此时用户可通过std::move()把需要的数据移走。
  • SeriesWork和ParallelWork是两种框架对象,同样在callback之后被回收。
  • 项目中不使用std::shared_ptr来管理内存。
  • 2021SC@SDUSC 目录 一.message.cc中所用的库 1.errno.h 2.C标准库-stdlib.h 四个变量类型包括: 库宏: 库函数: 3.C 标准库 - string.h 4.stdint.h 5.utility 本篇进入message.cc的具体代码学习。本篇以及接下来的两篇将细致分析message.cc的具体代码 实现。适合初学者(因为作者也比较菜,如果有错误,请指出!

  • 2021SC@SDUSC 目录 一.基础知识 二.关键代码分析 一.基础知识 1.友元函数 私有成员对于类外部的所有程序部分而言都是隐藏的,访问它们需要调用一个公共成员函数,但有时也可能会需要创建该规则的一项例外。 友元函数是一个不属于类成员的函数,但它可以访问该类的私有成员。换句话说,友元函数被视为好像是该类的一个成员。友元函数可以是常规的独立函数,也可以是其他类的成员。实际上,整个类都可以声明

  • 2021SC@SDUSC 目录 一.前置知识 二.具体代码分析 一.前置知识 1.  size_t: size_t是一些C/C++标准在stddef.h中定义的,size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数(在默认情况下声明的整型变量都是有符号的类型 除了char有点特别)。 2.错误代码: 人们在使用软、硬件的时候,软、硬件不能正常操作。由于错误的类型很多,为了对错误进行

  • //g++ -std=c++11 -o testhttp_get testhttp_get.cc -I/usr/local/include/workflow -lworkflow #include <netdb.h> #include <signal.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <s

  • class RedisValue { public: // nil RedisValue(); virtual ~RedisValue(); //copy constructor RedisValue(const RedisValue& copy); //copy operator RedisValue& operator= (const RedisValue& copy); /

  • 先看参考文献 C++ Web Framework/C++ Web开发框架 - QTCN开发网 - Powered by phpwind 找了一些C++的Web开发框架,看样子不少,有许多是基于Qt的,似乎第一个CppCMS这个名字比较大些。 1. CppCMS CppCMS — High Performance C++ Web Framework 以高性能著称,MVC,内容较全,包括数据库、会话等

  • 2021SC@SDUSC 目录 一.前置知识 1.头文件 二.代码分析部分 这一篇我们进入client.c的代码分析。这一章先介绍client.c的前置内容部分,主要的main方法我们放在下一篇文章来讲。 一.前置知识 1.<mutex>头文件 mutex 头文件中主要包含 Mutexes、lock 和相关的类型(Other types)和公共函数。 其中mutexes的相关类中,提供了几种锁对象

  • 原创地址: https://blog.csdn.net/y281252548/article/details/114867880   changelog 2021年1月19日 继续尝试编译并运行实例程序 2021年1月18日 初步编译运行程序,编译出错 下载代码eatcosmos/workflow: C++ Parallel Computing and Asynchronous Networkin

  • 1.workflow简介 按照workflow官方的README所述,Workflow是搜狗公司C++服务器引擎,编程范式。支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务,云输入法,在线广告等,每日处理数百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数后端与嵌入式开发需求。 2.安装workflow 首先,需要先下载workflow的源码,可以选择下载release版本或者直接

 相关资料
  • imi v1.0.13 版本新增了一个 Swoole\Coroutine\Http\Server 实现的协程服务器。需要 Swoole 4.4+ 才可使用该特性。 该特性是可选的,不影响以前使用的服务器模式。 使用协程服务器特性,依靠 Linux 系统的端口重用机制,系统级的负载均衡,可以让你的多进程 Http 服务处理请求的能力得到提升。 使用 ab,本机->虚拟机(双核+2进程)压测Hello

  • 我正在开发web套接字应用程序。从前端来看,每个应用程序都有一个插座。但我不确定后端。我们将Python和nginx与Flask socketIO和socket io客户端库一起使用。此体系结构将用于通知前端发生了更改,并应更新数据。 以下是我的疑问-服务器上将创建多少套接字和线程?不同连接之间是否可以共享套接字?是否有任何工具可以分析插座是否打开?

  • 创建索引器可以使一个对象像数组一样被索引。为类定义索引器时,该类的行为类似于一个虚拟数组,使用数组访问运算符([ ])则可以对该类来进行访问。 句法规则 创建一个一维索引器的规则如下: element-type this[int index] { // get 访问器 get { // 返回 index 指定的值 } // set 访问器 set

  • [danger] Deis Workflow不再维护 Deis Workflow v2.18将是最后一个发行版本,后续不再维护和更新。 推荐使用 Helm 来管理Kubernetes应用。 Deis workflow是基于Kubernetes的PaaS管理平台,进一步简化了应用的打包、部署和服务发现。 Deis架构 Deis安装部署 首先需要部署一套kubernetes(比如minikube,GK

  • 本文向大家介绍单台web服务器如何尽可能的提高网站性能,包括了单台web服务器如何尽可能的提高网站性能的使用技巧和注意事项,需要的朋友参考一下 我觉得首先要选择一个合适的环境,对于大多数php站点来说,运行在lnmp(linux+nginx+mysql+php)环境下是个理想的选择. 首先一点linux对比win的优势我就不说了。 其次nginx的优势总结起来就是负载均衡,高并发性能优异。 这里p

  • 问题内容: 我正在使用SQL Server 2008 Enterprise。我正在使用链接服务器技术从另一台服务器链接另一台SQL Server 2008 Enterprise实例。我编写TSQL来操作两个服务器实例中的对象(例如表)。 我的问题是,对于链接服务器,是否存在很大的性能问题?如果是,我们应遵循的主要性能瓶颈和最佳实践是什么? 在此先感谢,乔治 问题答案: 我的问题是,对于链接服务器,