Apache BRPC中的Streaming RPC技术详解

Apache BRPC中的Streaming RPC技术详解

brpc brpc is an Industrial-grade RPC framework using C++ Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. "brpc" means "better RPC". brpc 项目地址: https://gitcode.com/gh_mirrors/brpc6/brpc

什么是Streaming RPC

在分布式系统中,客户端与服务端之间经常需要传输大量数据,这些数据可能体积庞大或者持续产生,无法通过单个RPC调用的附件来传输。传统解决方案存在两个主要问题:

  1. 并行RPC传输难以保证数据顺序,拼接逻辑复杂
  2. 串行RPC传输效率低下,每次传输都需要等待网络往返时间(RTT)和处理延迟

Apache BRPC提供的Streaming RPC技术解决了这些问题,它允许在客户端和服务端之间建立用户态的流式连接(Stream),具有以下特点:

  • 基于消息边界传输
  • 严格保证消息顺序
  • 全双工通信
  • 内置流控机制
  • 支持超时提醒

Streaming RPC核心概念

Stream的建立过程

Stream的建立类似于TCP连接的三次握手:

  1. 客户端创建本地Stream
  2. 通过一次RPC调用(必须使用baidu_std协议)尝试与服务端建立Stream
  3. 服务端接受请求后,Stream建立完成

整个过程通过StreamId来标识和管理Stream,所有操作都基于这个标识符。

消息传输特性

  • 消息边界明确:接收端能准确区分不同消息
  • 顺序保证:接收顺序与发送顺序严格一致
  • 全双工通信:双方可以同时发送和接收数据
  • 流控机制:防止发送方压垮接收方

使用Streaming RPC

客户端创建Stream

客户端使用StreamCreate函数创建Stream:

int StreamCreate(StreamId* request_stream, 
                Controller &cntl, 
                const StreamOptions* options);

其中StreamOptions包含重要配置参数:

  • max_buf_size:远程端未消费数据的最大大小限制
  • idle_timeout_ms:空闲超时时间
  • messages_in_batch:批量处理消息的最大数量
  • handler:消息处理回调接口

服务端接受Stream

服务端使用StreamAccept接受客户端发起的Stream:

int StreamAccept(StreamId* response_stream,
                Controller &cntl,
                const StreamOptions* options);

消息处理机制

通过继承StreamInputHandler类实现消息处理逻辑:

class StreamInputHandler {
public:
    // 处理接收到的消息
    virtual int on_received_messages(StreamId id, 
                                   butil::IOBuf *const messages[], 
                                   size_t size) = 0;
    
    // 处理空闲超时
    virtual void on_idle_timeout(StreamId id) = 0;
    
    // 处理Stream关闭事件
    virtual void on_closed(StreamId id) = 0;
};

数据写入Stream

使用StreamWrite函数向Stream写入数据:

int StreamWrite(StreamId stream_id, const butil::IOBuf &message);

返回值为0表示成功,其他错误码包括:

  • EAGAIN:流控限制,缓冲区满
  • EINVAL:Stream无效或已关闭

流控机制

Streaming RPC提供了完善的流控机制:

// 同步等待缓冲区可用
int StreamWait(StreamId stream_id, const timespec* due_time);

// 异步等待缓冲区可用
void StreamWait(StreamId stream_id, 
               const timespec *due_time,
               void (*on_writable)(StreamId stream_id, 
                                  void* arg, 
                                  int error_code),
               void *arg);

当未确认数据量超过max_buf_size时,StreamWrite会返回EAGAIN,此时可以通过上述函数等待缓冲区可用。

关闭Stream

使用StreamClose关闭Stream:

int StreamClose(StreamId stream_id);

关闭后:

  • 所有后续写入操作都会失败
  • 等待操作立即唤醒
  • 双方都会收到on_closed通知

最佳实践与注意事项

  1. 消息大小控制:当前实现不支持自动分割大消息,过大的单个消息可能导致TCP连接上的多个Stream出现队头阻塞问题。

  2. 错误处理

    • 总是检查Stream操作的返回值
    • 合理处理EAGAIN等错误码
    • 实现完整的错误恢复逻辑
  3. 性能调优

    • 根据实际场景调整max_buf_size
    • 合理设置idle_timeout_ms避免不必要的超时
    • 优化messages_in_batch提高批量处理效率
  4. 资源管理

    • 及时关闭不再使用的Stream
    • 避免Stream泄漏
    • 合理处理连接断开等异常情况

Streaming RPC是Apache BRPC提供的高效数据传输解决方案,特别适合大规模、持续性的数据传输场景。通过合理使用其提供的各种机制,可以构建高性能、可靠的分布式应用。

brpc brpc is an Industrial-grade RPC framework using C++ Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. "brpc" means "better RPC". brpc 项目地址: https://gitcode.com/gh_mirrors/brpc6/brpc

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣钧群

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值