chromium通信系统-ipcz系统(八)-ipcz系统代码实现-跨Node通信-Broker和Broker通信

2024-01-01 20:28

本文主要是介绍chromium通信系统-ipcz系统(八)-ipcz系统代码实现-跨Node通信-Broker和Broker通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面我们分析了Broker和NonBroker通信,也分析了NonBroker和NonBroker通信,这里我们分析一下Broker和Broker通信过程。
我们直接一步到位,看NodeConnector的创建。

std::pair<Ref<NodeConnector>, IpczResult> CreateConnector(Ref<Node> node,Ref<DriverTransport> transport,IpczConnectNodeFlags flags,const std::vector<Ref<Portal>>& initial_portals,Ref<NodeLink> broker_link,NodeConnector::ConnectCallback callback) {const bool from_broker = node->type() == Node::Type::kBroker;const bool to_broker = (flags & IPCZ_CONNECT_NODE_TO_BROKER) != 0;const bool share_broker = (flags & IPCZ_CONNECT_NODE_SHARE_BROKER) != 0;const bool inherit_broker = (flags & IPCZ_CONNECT_NODE_INHERIT_BROKER) != 0;if (from_broker) {DriverMemoryWithMapping memory =NodeLinkMemory::AllocateMemory(node->driver());if (!memory.mapping.is_valid()) {return {nullptr, IPCZ_RESULT_RESOURCE_EXHAUSTED};}if (to_broker) {return {MakeRefCounted<NodeConnectorForBrokerToBroker>(std::move(node), std::move(transport), std::move(memory),flags, initial_portals, std::move(callback)),IPCZ_RESULT_OK};}......return {nullptr, IPCZ_RESULT_INVALID_ARGUMENT};
}

当前节点是broker的情况下,对端节点也是broker,就是broker to broker请求,创建NodeConnectorForBrokerToBroker。
NodeConnectorForBrokerToBroker

  // NodeConnector:bool Connect() override {DVLOG(4) << "Sending direct ConnectFromBrokerToBroker from broker "<< local_name_.ToString() << " with " << num_portals()<< " initial portals";ABSL_ASSERT(node_->type() == Node::Type::kBroker);msg::ConnectFromBrokerToBroker connect;connect.params().name = local_name_;connect.params().protocol_version = msg::kProtocolVersion;connect.params().num_initial_portals =checked_cast<uint32_t>(num_portals());connect.params().buffer = connect.AppendDriverObject(link_memory_allocation_.memory.TakeDriverObject());connect.params().padding = 0;return IPCZ_RESULT_OK == transport_->Transmit(connect);}

从broker链接另一个broker的消息对象为ConnectFromBrokerToBroker, ConnectFromBrokerToBroker的参数如下
name: 当前进程的NodeName,后面我们称这个进程为A进程,接收链接的进程为B进程。
protocol_version: 协议版本
num_initial_portals: 要初始化的RouterLink
buffer: 共享内存对象
padding: 用于对齐。

我们看对端收到消息如何处理

 // NodeMessageListener overrides:bool OnConnectFromBrokerToBroker(msg::ConnectFromBrokerToBroker& connect) override {const NodeName& remote_name = connect.params().name;DVLOG(4) << "Accepting ConnectFromBrokerToBroker on broker "<< local_name_.ToString() << " from other broker "<< remote_name.ToString();const LinkSide this_side =remote_name < local_name_ ? LinkSide::kA : LinkSide::kB;DriverMemory their_memory(connect.TakeDriverObject(connect.params().buffer));DriverMemoryMapping primary_buffer_mapping =this_side.is_side_a() ? std::move(link_memory_allocation_.mapping): their_memory.Map();if (!primary_buffer_mapping.is_valid()) {return false;}Ref<NodeLink> link = NodeLink::CreateActive(node_, this_side, local_name_, remote_name, Node::Type::kBroker,connect.params().protocol_version, transport_,NodeLinkMemory::Create(node_, std::move(primary_buffer_mapping)));AcceptConnection({.link = link, .broker = link},connect.params().num_initial_portals);return true;}

创建NodeLink, 注意这里面LinkSide 根据NodeName做比较确定。 共享内存使用LinkSide::kA端提供的共享内存。 对应的Connection 的broker 指向核对段的链接。

到这里我们所有的链接类型就分析完了,下面对NodeConnector 和 Connection的几种情况做一下总结。

NodeConnector类型:

Broker 和 NonBroker建立链接(假设A是Broker, B是NonBroker):

  • NodeConnectorForBrokerToNonBroker: 用于A链接B进程,创建的Connection.link 指向A->B链接,Connection.broker 为空。
  • NodeConnectorForNonBrokerToBroker: 用于B链接A进程。创建的Connection.link 指向B->A链接,Connection.broker 也指向B->A链接。

NonBroker 和NonBroker建立链接: (假设主动发起请求的NonBroker 为B, 另一个NonBroker为C, Broker 为A)

  • NodeConnectorForReferrer: 用于B 向C主动发起链接的过程中, 用于帮助A 和 另一个C 建立链接的NodeConnector。
  • NodeConnectorForBrokerReferral: 用于B 向C主动发起链接的过程中, A 一端建立的NodeConnector对象,用于等待C端链发起链接。收到C端发请求后帮助B和C建立链接。
  • NodeConnectorForReferredNonBroker: 用于C端请求NodeConnectorForBrokerReferral,并且接收NodeConnectorForBrokerReferral请求,建立C->A 和 C->B链接。

以上过程建立了三个链接:
C->A:Connection.link 为C到A的NodeLink, Connection.broker 为C到A的NodeLink。
A->C: Connection.link 为A到C的NodeLink, Connection.broker 为空。
B->C: Connection.link 为B到C的NodeLink, Connection.broker 为 B到A的NodeLink。
C->B: Connection.link 为C到B的NodeLink, Connection.broker 为 C到A的NodeLink。

也就是NonBroker<->NonBroker 的链接Connection->broker 都是和Broker的NodeLink。

Broker 和Broker建立链接
NodeConnectorForBrokerToBroker: 用于Broker 和Broker 建立链接, Connection.link 为指向对端的NodeLink, Connection.broker 也是指向对端的NodeLink。

到此几种链接我们都分析过了。下面就可以分析代理消除了。

这篇关于chromium通信系统-ipcz系统(八)-ipcz系统代码实现-跨Node通信-Broker和Broker通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali