当前位置: 首页 > news >正文

brpc异步请求封装

使用brpc发送proto格式的消息时,针对不同类型的请求,每个模块可能各自使用一套接口。但是对于该客户端上的各类请求,其链接管理,故障重发,这些是一致的。为了统一这些请求的处理,因此做了如何封装。https://gitee.com/lang2020/brpc_async

一、核心设计定位和价值

基于 BRPC 框架封装的异步 RPC 客户端通用框架,核心目标是屏蔽底层 BRPC 异步调用细节,为上层业务提供统一、简洁、可复用的异步 / 同步 RPC 调用能力,同时内置完善的可靠性保障机制,实现业务逻辑与 RPC 通信逻辑解耦。

  1. 简化使用:业务方只需关注业务请求和回调逻辑,无需编写复杂的 BRPC 异步代码。
  2. 统一规范:全系统 RPC 调用遵循统一范式,降低协作和维护成本。
  3. 高性能高可用:异步架构保证高并发,内置重试、超时保证服务可靠性。
  4. 易扩展:模板化 + 多态设计,快速支持新业务 RPC 接口和新特性扩展。

二、使用示例

针对一个具体的proto的rpc协议,只需要加两行声明具体的模板类。

/* package example; service EchoService { rpc Echo(EchoRequest) returns (EchoResponse); }; */ struct EchoTypes { using Client = BRPCAsyncClientTemplate<example::EchoRequest, example::EchoResponse, example::EchoService_Stub, &example::EchoService_Stub::Echo>; using ORequest = ObjectRequest<example::EchoRequest, example::EchoResponse, Client>; using Operation = ObjectOperation<example::EchoRequest, example::EchoResponse>; }; using EchoObjectRequest = EchoTypes::ORequest; using EchoObjectOperation = EchoTypes::Operation;

然后就可以直接定义自己的请求,实现具体的同步或者异步发送。每一个请求new一个ObjectRequest,然后发送出去,请求完成后会自动释放资源。

class TestOperation { public: explicit TestOperation() = default; void test_sync() { EchoObjectOperation op; op.request.set_message("test_value"); op.request.set_id(1); auto* sync_req = new EchoObjectRequest(op); sync_req->request(); ldout(nullptr, 0) << "test1: sync_req->request() end" << dendl; } void test_async_callback() { EchoObjectOperation op; op.request.set_message("test_value"); op.request.set_id(2); //支持ceph的Context回调,可以改成通用lambda Context* ctx = create_context_callback<TestOperation, &TestOperation::handle_echo_response>(this); auto* async_req = new EchoObjectRequest(op, ctx); async_req->async_request(); } void handle_echo_response(int result) { ldout(nullptr, 0) << "handle_echo_response: result=" << result << dendl; } void test_async_lambda() { EchoObjectOperation op; op.request.set_message("test_value"); op.request.set_id(3); Context* ctx = make_lambda_context([this, response = op.response](int result) { ldout(nullptr, 0) << " test3: response.use_count()=" << response.use_count() << dendl; handle_echo_response(result, response.get()); }); auto* async_req = new EchoObjectRequest(op, ctx); async_req->async_request(); } void handle_echo_response(int result, example::EchoResponse* response) { ldout(nullptr, 0) << "handle_echo_response: " << result << ", message: " << response->message() << dendl; } ~TestOperation() {} private: };

三、核心设计思想

1. 模板化泛型设计:通用化 + 高复用

  • 采用模板元编程抽象 RPC 客户端核心逻辑,通过模板参数绑定请求 / 响应体、RPC 方法,一套模板支撑所有业务 RPC 接口(如 Echo、Kv)。
  • 无需为每个业务接口重复编写 RPC 调用代码,极大提升框架复用性和扩展性,新增 RPC 服务只需实例化模板即可。

2. 异步为主、同步兼容:灵活适配业务场景

  • 核心能力:原生支持异步非阻塞 RPC 调用,通过回调机制实现请求发送后立即返回,不阻塞主线程,适配高并发、高性能场景。
  • 异步仿照ceph rbd层、rados的aiocompletion实现。后续可扩展回调函数为lamba表达式,提高灵活性。
  • 兼容能力:封装同步调用接口,基于异步能力实现等待完成的同步语义,满足简单业务的同步调用需求,兼顾灵活性与易用性。

3. 分层解耦:职责清晰、易于维护

代码严格分为三层架构,层与层之间低耦合、高内聚:

  1. 底层通信层:封装 BRPC Channel、Controller、定时器等底层组件,负责网络通信、请求发送 / 接收。
  2. 中间框架层:提供异步上下文管理、回调调度、重试机制、超时控制等通用能力,是框架核心。
  3. 上层业务层:业务请求封装(如 读写请求的封装),仅关注业务逻辑,无需关心 RPC 底层细节。

4. 可靠性内置

框架原生集成高可用机制,无需业务层关注:

  • 自动重试:支持可配置的重试次数、退避延迟、抖动策略,应对网络抖动、临时故障。
  • 超时控制:区分单次调用超时和总超时,精细化管控请求耗时。
  • 故障容错:支持服务地址计算、通道管理、定时器取消,保障异常场景下的资源释放和系统稳定。

四、待实现

  1. server端考虑开启brpc自带的自适应限流。
  2. 由于server端可能开启qos限流导致client即时延迟发送也可能由于和非重试请求导致重试风暴,因此client端重试和非重试请求准备加上基于令牌桶的限流,且重试请求优先级高于普通请求。
http://www.gsyq.cn/news/1335761.html

相关文章:

  • 【2026 新版】Open Claw v 2.7.5 电脑端极速部署实操指南
  • 恍如宋朝的回门宴
  • Transformer 核心模块详解:多头注意力、前馈网络与词嵌入
  • Delphi二进制迷宫破解:IDR交互式重构器的逆向工程革命
  • 你的闹钟为何总在熄屏后“哑火”?——AlarmManager 精准唤醒与 Doze 破解全指南
  • 2026年知名的镇江防腐网格桥架优质厂家推荐榜 - 行业平台推荐
  • Attractor Models 深度拆解:当循环 Transformer 遇见不动点,AI 学会了自己迭代到答案
  • 【从零学Vibe Coding】第一章:Vibe Coding 到底是什么?
  • O2OA(翱途)开发平台V10 财务管理|中小企业费用业务一体化
  • LLM结构化输出工程:让模型输出你真正需要的格式
  • MobileNetV2肺癌病理图像分类|全网独家实战,MSA注意力改进篇 引入MSA多尺度注意力,强化病理特征提取、助力微小病灶识别、病理切片分类、临床辅助诊断有效涨点
  • CAPEv2 沙箱安装部署
  • 一多 OS 的技术闭环彻底打通
  • 鸿蒙动态信息流与健康档案模块:声明式列表与网格的深度融合
  • AI产品经理入门实战:如何理解数字人驱动?
  • 百万级 MySQL 大表导入前,别让这两个默认参数拖垮性能_2026-05-20
  • COMSOL电磁超声仿真避坑指南:从‘域不适用’报错到结果收敛的完整调试流程
  • 无人机算法之第四章 ArduPilot 主要配置参数及效果
  • GNSS模块教程:大夏龙雀 DX-GP21,从硬件接线到 NMEA 数据解析
  • [具身智能-824]:人的大脑,如何实现高实时、多模态联合、发现表象背后的各种规律和层层叠叠的不同层次的语义的?
  • 【C++】类和对象( 类的定义、实例化、 this指针、 C++和C语言实现Stack对比)
  • 电脑截图工具深度测评:PixPin、Snipaste、兔灵截图(Utools插件)
  • ⚡ 淘汰你的不是 AI,而是会用 AI 的同行
  • 8 张 RTX 5090 跑 Qwen3.6-27B:从装 vLLM 到压测调优的真实数据(含完整脚本)
  • 全面详解 bgfx
  • 别再乱改Rime配置了!先搞懂程序文件夹和用户文件夹的区别(Windows/Ubuntu路径详解)
  • Cursor试用限制终极解决方案:3分钟快速重置设备标识实战指南
  • 无磁钻具:市场发展现状与未来前景趋势
  • FPGA管脚不够用?手把手教你用74HC595级联驱动8位数码管(附Verilog代码与仿真)
  • 测试经理为保障项目按期交付,主动规划核心内容