Flare是广泛投产于腾讯广告后台的现代化C++开发框架,包含了基础库、RPC、各种客户端等。主要特点为易用性强、长尾延迟低。
Flare是广泛投产于腾讯广告后台的现代化C++开发框架,包含了基础库、RPC、各种客户端等。主要特点为易用性强、长尾延迟低。
Flare Backend Service Framework
English Document 腾讯广告 是腾讯公司最重要的业务之一,其后台大量采用 C++ 开发。
Flare 是我们在汲取自研服务框架经验、参考业界开源项目和最新研究成果的基础上,开发的现代化后台服务开发框架。目标是在当今主流软硬件环境下,提供易用、高性能、平稳的服务开发能力。
Flare 项目始于 2019 年,目前广泛应用于腾讯广告的各类后台服务,拥有数以万计的运行实例,在生产系统上经受了充分的考验。
2021 年 5 月,我们本着回馈社区、技术共享的精神正式将 Flare 开源。
std::atomic<T>::wait / notify_* 的 libstdc++ 版本,参见 P1135)std::atomic<T>::wait / notify_* 运行期符号)Flare 是开箱即用的,已经自带了所需的第三方库,通常不需要额外安装依赖。
thirdparty/ 下的源码包通过 Git LFS 存储,因此拉取代码前请确保 git-lfs 已正确安装。
我们使用 blade 进行日常开发:
./blade build ..../blade test ...Flare 也支持 bazel 作为构建系统,参见 bazel support。
之后可以参考入门导引,搭建一个简单的 RPC 服务。
我们认为调试体验是开发维护过程中很重要的一环,为此提供了:
为改善编写单测的体验,我们提供了一些测试工具,包括但不限于:
我们提供了一些使用示例,下面是一个简单的转发服务(同时演示了 RPC 客户端与服务端的使用):
…Flare 内部基于 M:N 用户态线程实现,因此通过 Flare 同步请求外部服务、调用 Flare 内置的各种客户端 的同步接口都不会带来性能问题。如有更复杂的并发或异步需求,可参考 Fiber 文档。
另外,示例中的 *.flare.pb.h 通过 Flare 的 Protocol Buffers 插件 生成。相对于 Protocol Buffers 原生的 cc_generic_services,这种方式生成的接口更易用。
实际使用中往往需要并发请求多种后端,下面的示例展示了如何在 Flare 中实现这种模式:
…这个示例中,我们:
flare::fiber::BlockingGet 同步等待所有请求完成——这里只会阻塞用户态线程,不会有性能问题出于展示目的,这里请求的是三个异构服务。如有需要,也可以用同样的方式请求同构服务、或同构异构混合的服务。
我们非常欢迎共建。希望了解 Flare 更多内部设计的开发者、或需要对 Flare 进行二次开发的开发者,可参考 flare/doc/ 下的技术文档。
详情请参考 CONTRIBUTING.md。
由于业务需求的特点,我们在设计中更倾向于优化延迟及其平稳性,而非吞吐;但在这一前提下也尽力兼顾性能。
简单的对比数据可见初步性能数据。
在此向上述项目一并致以谢意。
No open issues yet, or sync has not completed.