Facebook 开源的 C++ 网络库 wangle 和 Boost.Asio 有何异同?

Wangle(facebook/wangle · GitHub )和 Boost.Asio 有何异同?如果使用的话有什么建议?
关注者
468
被浏览
64,613

11 个回答

wangle 底层依赖 folly 库的 io 模块。后者和 asio(以及 libevent)是一个层级的东西,都是对于网络层基础设施的抽象(比如说对 epoll 的封装等等),类比 Java 中的 Socket/Channel 这一套封装。

wangle 是更上一层的抽象,主要是使用 pipeline 的形式处理 connection(类比 gRPC 中的 Channel)中的数据,pipeline 中的每一个 transformer 都可以对数据报文做一次变换,比如说一开始是个 bytes 流,然后经过一级变换变成了切分好的 Block 流,然后再经过一级变换从 Block 变成 Request 流,然后被业务逻辑处理,返回 Response,处理成 Block,再处理成 bytes。

可以认为 wangle 库是自定义二进制 RPC 协议并进行处理的一个库,在这之上可以用于构建 RPC 框架,例如 fbthrift,grpc,etc.

wangle的出发点其实是在c++下面又一个类似finagle的库。wangle主要是让c++用户在不需要特别理解网络层面的状况下可以写出高效的服务器端代码。

我个人觉得wangle最大的亮点是它的future库,在这里有做介绍

github.com/facebook/wan
auto f = getClient(getIOExecutor()->getEventBase())->callSomeFunction(args...)
         .via(getCPUExecutor())
         .then([](Result r){ .... do something with result});

在wangle的框架下面,你可以一个callback接着一个callback的执行,io intensive的就跳到io thread上面,cpu intensive 的就跳到cpu thread上面,这个是非常非常方便的。这个在逻辑上其实很像coroutine但是在c++下面也不至于太跳脱,非常好用也很好理解。wangle其实最重要的还是Facebook为内部的c++代码服务,所以功能相对少。


boost::asio 相较之下就是一个boost的库,以后是要进stl的,功能必须多到飞起。光是看overview

Overview - 1.61.0

就得准备起飞了,而且相对socket层面的API多一点,是可以给人在上面写库的,不单纯只是让你写服务器端的代码。它的客户是世界上所有的c++网络端的程序员。