自动驾驶通信中间件ecal源码分析—2. Broker vs Brokerless

Posted lyf5231

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动驾驶通信中间件ecal源码分析—2. Broker vs Brokerless相关的知识,希望对你有一定的参考价值。

前面我们提到ecal是没有中间代理商的(brokerless),那么什么是Broker和Brokerless。

1. Message Broker

A message broker is software that enables applications, systems, and services to communicate with each other and exchange information. The message broker does this by translating messages between formal messaging protocols. This allows interdependent services to “talk” with one another directly, even if they were written in different languages or implemented on different platforms.

Message broker是一个应用程序,它的存在可以使得不同的应用程序(APP)/系统/服务互相进行通信(数据交互)。Broker可以实现消息协议之间的自动转换(假设接收端和发送端的通信协议不同),即使应用程序位于不同的系统、采用不同的编程语言编写。

如上图所示,Broker充当了消息代理人的身份,它接收消息生产者(producer)的数据,然后对这些消息进行协议转换(如果需要),然后再发送给消息消费者(consumer)。

从上面的说明,我们能很容易得到broker这种网络架构带来的优点:

  1. 对于broker两端的应用程序等不需要知道其他应用程序的存在实体(ip,端口等),唯一需要知道的就是broker的ip等信息。broker会将接收到的消息路由到对应的应用程序(依据"queue name", “routing key”, “topic”, "message properties"等,而不是依据ip/端口等信息);
  2. 消息的发送者和接收者的生存期不必重叠,例如,消息发送端将消息发送给broker后程序结束,这时候不影响消息接收者,因为broker会负责将消息发送给接收者;

同时,broker这种网络架构带来的缺点也非常明显:

  1. 所有消息的发送/接收都要经过broker,所以broker会成为整个系统的瓶颈点,影响整个系统的数据传输的延时和吞吐量。

2.Message Brokerless

上图所示为不带中间代理商的网络架构(Brokerless),可以看到其优点为:

  1. 网络连接数减少,由之前的6条数据连接减为3条;
  2. 由于是点对点直接连接,该网络架构适合于低延时/高并发的场景。

但是为了达到点对点连接,消息生产者首先需要知道消息消费者的ip等信息(对于小型的系统,可以用固定的网络拓扑来完成,但是对大型系统来说不现实),因此

  1. 首先需要解决的第一个问题是邻居发现(discovery),依靠邻居发现功能消息生产者可以自动发现消息消费者的ip等信息;
  2. 第二个要解决的问题是消息生产者和消费者的动态加入和退出的实时处理机制。

3.ros1的连接建立过程

接下来利用ros1中基于Topic的通信连接的建立来说明Broker和Brokerless,

上图为ros官方提供的数据连接示意图,利用rviz查看激光点云数据(sensor_msgs/LaserScan),其具体流程为

  1. ros在启动任何节点之前都必须启动roscore节点(ros master),且整个系统也只会存在唯一一个roscore节点(进程);
  2. ros master有一个所有其他node节点都知道的XMLRPC URI;
  3. 启动hokuyo_node驱动节点,将激光雷达驱动起来,并在**”scan”** topic上发送sensor_msgs/LaserScan数据。在节点第一次在topic上发送数据之前,首先会将要发送的数据信息发送给master,包括发送的数据类型,topic名字,发送者的URI(hostname+port)等(上图中topic为scan,hostname为foo,port为1234),然后ros master会将这些信息记录在publisher表中(在没有subscriber时,publisher不会真正的发送数据);
  4. 当启动rviz配置好topic等信息后,会启动一个subscriber去订阅**”scan”** topic上的sensor_msgs/LaserScan数据,首先会去和ros master通信,利用XMLRPC去获取谁在**”scan”** topic上发送数据,ros master返回发送者的URIfoo:1234,但是该URI不是用来发送数据的;
  5. subscriber去连接publisher的URI,此时publisher返回真正的数据URIfoo:2345,接着subscriber去连接publisher的数据URI,进行真正的TCP数据传输。

从上面的过程可以看出,ros1不是真正意义上的broker网络架构,因为真正的TCP数据连接不经过ros master。ros master的主要作用是为系统的其他节点提供topic的注册服务,帮助publisher和subscriber完成连接的建立,起到了邻居发现的功能。同时也不是Brokerless的,因为如果没有ros master,整个ros系统的数据连接根本无法建立,这也是ROS1的一个最大问题,单节点失效问题,如果在系统正在运行过程中,roscore出现故障,整个系统就无法正常运行。

以上是关于自动驾驶通信中间件ecal源码分析—2. Broker vs Brokerless的主要内容,如果未能解决你的问题,请参考以下文章

自动驾驶通信中间件ecal源码分析—1. 什么是ecal

自动驾驶通信中间件ecal源码分析—2. Broker vs Brokerless

自动驾驶通信中间件ecal源码分析—2. Broker vs Brokerless

自动驾驶通信中间件ecal源码分析—2. Broker vs Brokerless

自动驾驶 Apollo 源码分析系列,系统监控篇:Monitor模块如何监控通信中 channel 的时延?

自动驾驶 Apollo 源码分析系列,系统监控篇:Monitor模块如何监控通信中 channel 的时延?