【brpc学习实践】ParallelChannel的使用与并行请求

2023-12-01 02:12

本文主要是介绍【brpc学习实践】ParallelChannel的使用与并行请求,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概览

ParallelChannel (有时被称为“pchan”)同时访问其包含的sub channel,并合并它们的结果。用户可通过CallMapper修改请求,通过ResponseMerger合并结果。ParallelChannel看起来就像是一个Channel:

  • 支持同步和异步访问。

  • 发起异步操作后可以立刻删除。

  • 可以取消。

  • 支持超时。

任何brpc::ChannelBase的子类都可以加入ParallelChannel,包括ParallelChannel和其他组合Channel。用户可以设置ParallelChannelOptions.fail_limit来控制访问的最大失败次数,当失败的访问达到这个数目时,RPC会立刻结束而不等待超时。

一个sub channel可多次加入同一个ParallelChannel。当你需要对同一个服务发起多次异步访问并等待它们完成的话,这很有用。

ParallelChannel的内部结构大致如下:
在这里插入图片描述

应用场景及详细应用剖析

实际开发中,我们常对下游服务有多次访问的需求,使用该接口能让串行的多次访问并行化,从而降低服务的整体平响。

官方的案例中默认不去对CallMapper做调整,实际开发中通常需要重写自己的CallMapper。

class TestCallMapper : public baidu::rpc::CallMapper {
public:virtual baidu::rpc::SubCall Map(int channel_index/*starting from 0*/,const google::protobuf::MethodDescriptor* method,const google::protobuf::Message* request,google::protobuf::Message* response);
};class TestResponseMerger : public baidu::rpc::ResponseMerger {
public:virtual baidu::rpc::ResponseMerger::Result Merge(google::protobuf::Message* response,const google::protobuf::Message* sub_response);
};

下面我们来看下pchan的整体使用流程
与常规channel一样我们通常需要在client中初始化pchan

baidu::rpc::ParallelChannelOptions pchan_optons;
pchan_optons.timeout_ms = _options.timeout_ms;
pchan_optons.fail_limit = all_requests.requests_size();baidu::rpc::ParallelChannel pchan;
pchan.Init(&pchan_optons);

同时需要绑定我们自己定义的CallMapper和Merger

TestCallMapper* test_call_mapper = new BusBasicEtaCallMapper();
TestResponseMerger* test_response_merger = new BusBasicEtaResponseMerger();

call_mapper内含引用计数,一个call_mapper可与多个sub channel关联。所以我们只用定义一个就可以,根据请求的数量添加对应数量的sub_channel,注意,这里如果是对同一个下游多次请求,就只用同一个channel即可,如果我们想做的是同时请求多个下游,可以初始化不同的sub_channel,然后添加进来,只不过就会导致我们的协议(request、response)要求能复用,一般对多个下游我们还是推荐使用bthread或者pthread来使用不同的channel,以便使用不同的协议。当然我们也可以初始化多个pchan来同时请求多个下游。

for () {for (int i = 0; i < all_requests.requests_size(); ++i) {pchan.AddChannel(&_channel,baidu::rpc::DOESNT_OWN_CHANNEL,eta_call_mapper,eta_response_merger);}
}

AddChannel的源码如下

int ParallelChannel::AddChannel(ChannelBase* sub_channel,ChannelOwnership ownership,CallMapper* call_mapper,ResponseMerger

这篇关于【brpc学习实践】ParallelChannel的使用与并行请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/439419

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完