百度Apollo系统学习-Cyber RT 通信-上层
简介
Cyber作为一个中间件,最基础的功能就是解决不同模块不同进程之间的通信问题,所以这篇文章主要带大家理清cyber中的通信方式。因为这部分内容较多,所以通信模块会分两篇文章来说明,本文为上篇,主要关注偏上层的部分(下图中除了Transport的部分)。
注:本文中部分图片来自@Kit Fung的Apollo分析博客

通信类结构

第零层:
Node
上图展示了通信功能封装最顶层的类Node,每个Component都有一个Node,每个Node负责创建Reader, Writer, Service, Client来帮该组件获取信息或传达信息。每个Node保存了它的名字和名字空间,一个存有channel_name对应的Reader的map以及一个NodeChannelImpl和一个NodeServiceImpl(创建以上4种东西的创建器)。
第一层:
NodeChannelImpl
NodeChannelImpl是Node用来创建Channel相关的Reader和Writer的类,在实际环境中,创建的为Reader,Writer,虚拟环境中创建的是IntraReader,IntraWriter。它会向通信拓扑注册当前节点。
NodeServiceImpl
和NodeChannelImpl类似,只不过它创建的是Service和Client,还会注册service。
第二层:
Reader
Reader继承自ReaderBase,它包含一个Blocker和一个Receiver。Reader只在实际环境中会被NodeChannelImpl创建,并主要做两个事:
- 每当该channel来了一个消息,就会调用其Enqueue函数,该函数会调用Blocker::Publish函数把该消息放入Reader中的Blocker的published_msg_queue队列并调用Blocker保存的相应的回调函数来处理(可是实际环境中Blocker的回调函数为空,所以不会有用)。
- 如果一开始设置有一个回调函数,那么当message到达时就会在调用Enqueue函数后额外调用该回调函数来处理(可是实际环境中Reader的回调函数都为空,所以这一步是不可能发生的)
Writer
向对应的channel写数据,最后会调用到transport::Transmitter->Transmit函数,每个Writer只能写一个channel但某个channel可以有多个Writer。

文章详细剖析了Apollo项目中CyberRT的通信机制,包括Node、Reader、Writer等关键类结构,以及在实际与虚拟环境下的数据流差异。强调了Cyber作为中间件在不同模块间通信的重要性。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



