单机 40 万 QPS,搜狗 WF 框架,今年最值得学习的开源代码

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

职业生涯的前五年,基本上都在做即时通讯业务,由于业务的特殊性,吞吐量极大,时延不这么敏感,团队内部单独开发了一套纯异步 omni 框架。

学习 omni 框架内核,对职业生涯的提升极大,协议设计与实现底层网络通信多线程同步与互斥同步 RPC异步 RPC服务器框架… 掌握了一套 RPC 内核原理与细节,基本上国内大部分公司的 offer 能手到擒来。

很多朋友问,如何学习 RPC 内核知识?

我的回答是,直接看源码。

代码面前,没有秘密,看源码,写 demo,单步调试,比听任何大神吹牛,比看任何理论书籍,都来得直接。

又有朋友问,目前开源的 brpc 以及 thrift,都太重了,有没有更轻量级的服务端框架呢?

这里,我强烈推荐,搜狗开源的轻量级高性能服务器引擎 WF:

(1)看其代码,及其清爽易懂;

(2)demo 简单,单步调试容易;

(3)doc 比较全,doc 与 src 同步更新,比起行业内一些 “为了开源而开源” 的 KPI 项目,显得有诚意多了;

个人觉得搜狗的 WF 框架,是目前国内开源的服务器引擎中最适合学习的

画外音:文末有 github 地址。

这里,把自己的学习心得,以及大家可能关心的问题,简单聊一聊。

什么是 WF,它是一个娱乐级框架,还是一个工业级框架?

WF,是搜狗开源的 C++ 服务器引擎框架。

WF 的设计目标是:轻量级,高性能。

轻量级,是指简洁,搜狗几乎所有的 C++ 后端服务,包含但不限于搜索,输入法,广告等都是基于这个框架,每天处理超过百亿的请求,它是一个已经经过多年线上考验的工业级框架

轻量级, WF 真的做到了吗?

大伙可以看下,用 WF 如何搭建 http 服务器:

https://mmbiz.qpic.cn/sz_mmbiz_png/YrezxckhYOyia7rkRySib8dUr3AITVyvwicx0EHMtqgaHz1xzUylicicUmhamr6rUMLCVRibSPicsLqgSeeJdKh9E7NKg/640?wx_fmt=png

这一段代码单步执行下来,IO 线程,工作线程,任务队列,线程同步互斥机制,超时处理机制,异常处理机制… 对于一个服务器框架,基本就拿下七八成。

高性能,WF 真的做到了吗?

大伙可以看下,WF 的单机压测表现:

https://mmbiz.qpic.cn/sz_mmbiz_png/YrezxckhYOyia7rkRySib8dUr3AITVyvwicibibUeO0JMFzXRL78WB7OpgZE52LSIrH8NYH6c5UVIK5Bl7PHEs8gjOg/640?wx_fmt=png

你没有看错,单机每秒 50W 的 QPS,特别是高并发压测的情况下,比 nginx 和 brpc 表现都要好。

画外音:

(1)测试硬件:CPU 40 core @ 2.20GHz,内存 192G,网卡 25000Mb/s;

(2)并发配置:nginx auto 进程数为 40,brpc 配置 nthreads 为 40,WF 配置 16 个 poller 线程与 20 个 handler 线程;

除了轻量级与高性能,WF 还有哪些特点?

除了核心设计目标的两点,WF 还有以下优势:

(1)易用性

相比 go 语言的简单,天下苦 C++ 久矣,虽然 C++ 后续也推出了各种简易用法,但并不是所有用户了解与掌握,目前 WF 的标准是 C++11,把很多复杂性都进行了屏蔽。

用户再也不用关注连接池、线程池、文件句柄,以及各种异步通知机制,WF 都进行了封装与细节屏蔽。

使用 WF,用户只需要关注两个核心概念任务(task)与任务流(series)。

(2)通信与计算一体的解决方案

大部分 RPC 框架着重解决通信的问题,而计算与任务调度框架需要用户自己实现,而 WF 框架则将二者融为一体,一并解决了。

WF 把网络,CPU,磁盘 IO,GPU,计时器,计数器都进行了封装,统一当成资源,使用者可以任意进行调度与组合,而不需要关注其底层的 epoll,pthread,aio,cuda,timer_fd,count 计数等。

(3)架构层次良好,非常方便业务逻辑的实现

WF 对于业务逻辑处理进行了抽象:

第一,串行由任务组成;

第二,并行由串行组成;

第三,并行是一种任务;

任务和任务流是 WF 的基石,WF 本身就是一套完备的、可以收敛的、容易控制的业务逻辑任务流模型。

(4)文档很全

除了轻量级,简单易用之外,其文档和 demo 非常齐全,对于新手及其友好。而且碰到代码中不明白的地方,可以直接联系开发小组,作者会直接和大家交流,避免二手消息。

https://mmbiz.qpic.cn/sz_mmbiz_png/YrezxckhYOyia7rkRySib8dUr3AITVyvwicmiaJSC6fxcK63EZEHu6sgQmgX7aIwBriaJnqZglzvVNuyvwzBVbDibW5Q/640?wx_fmt=png

这也是推荐 WF 成为大家学习上手的框架,很重要的原因。

可能有朋友会问,说框架太宏观,研究 WF,具体能学到哪些技术内容呢?

简单的举几个例子:

(1)学习错误处理:为了提升性能,WF 没有使用异常,研究 WF 能系统性学习错误处理,帮助我们写出极高质量的代码;

画外音:扪心自问,去掉异常,你写的代码会不会随时崩溃。

(2)学习超时处理:各种通信超时,任务超时,你真的理解其内核么?超时的原因与处理,WF 是学习利器。

(3)学习异步 IO:Linux 支持非常高效的异步 IO 系统调度,如何使用这些异步 IO 去实现框架,去封装任务,实现业务逻辑任务流化,看看 WF 的玩法。

(4)学习协议设计:学习如何利用 WF 框架,实现 brpc 和 thrift,实现自己自定义的 client/server 协议,实现自己的 RPC 系统。

(5)学习计时器与计数器:很有朋友 timer 和 count 用的非常多,但它底层是怎么实现的,值得深入研究。

(6)学习服务治理:WF 有一套完整的服务治理方案,包含服务路由,熔断与恢复,负载均衡,服务主备。可用于实现服务发现与服务网格(service mesh)系统。

画外音:这一部分,可以查看源码的 upstream 子模块。

(7)…

今年,看的最清爽的代码,最适合了解通信内核,RPC 内核,调度框架内核的引擎,强烈推荐给大家。欢迎大家 Fork,欢迎大家标星。

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

Star:1400+

画外音:WF 还有很多优秀的设计,等待大家去挖掘。

阅读原文,直达代码,好的代码,一起分享。