APP下载

基于主题发布-订阅的分布式通信总线设计与实现*

2021-08-06魏兴雲任祥维谭陆媛

通信技术 2021年7期
关键词:发布者管理器链路

魏兴雲,任祥维,谭陆媛

(中国电子科技集团公司第三十研究所,四川 成都 610041)

0 引 言

随着计算机与网络技术的高速发展,在计算机上处理的工作越来越多,业务也越来越复杂,多个系统(节点)协同工作的需求也越来越大。为了高效地实现系统间数据共享、互操作,解决系统不易集成问题,对象管理组织(Object Management Group,OMG)在高级体系结构(High Level Architecture,HLA)和通用对象请求代理体系(Common Object Request Broker Architecture,CORBA)等标准的基础上,制定了采用以数据为中心发布-订阅机制(Data Centric Publish Subscribe,DCPS)的分布式实时通信中间件技术规范:数据分发服务(Data Distribute Service,DDS)[1]。DDS基于主题进行数据发布-订阅,适用于分布式节点之间的数据交换,其以数据为中心,能实现高效和实时地数据交换[2]。在工业自动化、分布式控制和仿真应用等领域,许多实时应用程序都构建了以数据中心的DDS通信模型,其中部分应用程序发布(提供或流式传输)数据,供对该数据感兴趣的远程应用程序订阅使用。

1 数据分发服务DDS

1.1 DDS简介

根据规范,DDS主要分为如图1所示的两个层次,分别是DCPS层和本地数据重构(Data Local Reconstruction Layer,DLRL)层。其中,DCPS是数据发布-订阅系统的基本框架,其负责系统中数据的发布、订阅、处理、分发,并实现把主题数据发送给已订阅的节点;DLRL层的目的是外部应用程序与DDS内部的数据交互,提供简单的方式,使各个外部应用能够之间向DDS中获取数据或者向DDS中写入数据[1]。

本文所介绍的通信中间件主要参考DCPS层进行系统设计与实现,因此下文主要对DCPS的发布-订阅模型进行介绍。

1.2 DDS模型与DCPS

DCPS是实现数据发布订阅服务的基础框架,其概念模型如图2所示。它基于全局数据空间(Global Data Space,GDS)的概念,提供基于主题的数据发布和订阅相关功能[1]。

DCPS包括主题、数据读取器、订阅者、数据写入器、发布者等类型对象。以主题为中心,通过数据写入器进行主题数据的写入;通过数据读取器进行主题数据的读取;通过发布者和订阅者进行主题数据的发布与订阅。

按照属性与职责范围的不同可将DCPS分成基础设施模块、域模块和数据发布订阅模块3个部分。基础设施模块定义了系统的交互方式、服务质量(Quality of Service,QoS)以及质量策略等公共基础组件,是整个系统的基础模块。域模块域和数据发布订阅模块均依赖域基础设施模块。域模块作为系统服务的入口,系统通过该模块创建主题、发布者、订阅者。发布者和订阅者只能在相同的域中进行主题数据的交互。数据发布订阅模块由主题、发布者、订阅者、数据写入器、数据读取器等对象组成。发布者通过数据写入器进行主题数据发布。订阅者通过数据读取器进行主题数据获取。

1.3 DDS体系结构

DDS发布-订阅系统分为集中式和分布式两种体系结构。

集中式发布-订阅系统具有服务器节点和普通节点。其中服务器节点存储了所有系统发布订阅的数据信息,同时负责数据的调度、处理等各种事务。普通节点都连接到服务器节点,通过服务器节点进行数据的发布和订阅,各个普通节点之间不直接相连[3]。集中式体系结构的优点是连接结构简单,系统易于协调和控制,但是整个系统的运行依赖于服务器节点,一旦服务器节点出现问题,整个系统都将瘫痪而无法工作。目前最具代表性的集中式发布-订阅系统是TAO DDS,其为对象计算公司(Object Computing Inc.,OCI)的一个开源项目。

与集中式发布-订阅不同,分布式发布-订阅系统不存在服务器节点。该类型系统中每个节点都是相等的,都可根据需要成为主题数据的发布者和订阅者,并且都维护着整个系统各个节点之间的发布-订阅信息。该结构中,数据的发布订阅信息先在本节点处注册,而后通过系统中的一个网络中间件将本节点的信息发送至系统各节点处,使系统中所有节点处的发布-订阅信息都相同。该系统中,各个节点两两之间均建立通信链路。节点发布数据的时候,直接通过节点之间的连接将数据发送给已订阅数据的节点。相比于集中式结构,分布式结构具有更高的可靠性。系统中部分节点出现问题,只影响与出现故障节点之间的数据交互,其他节点之间的数据发布订阅仍可正常运行。同时,由于分布式结构中两两节点之间均建立通信连接,链路数据比集中式结构多,因此比较适合在小规模的网络中进行使用。

2 ZMQ通信库

2.1 ZMQ简介

ZeroMQ简称ZQM,是一种基于消息队列的多线程网络库,能够对套接字类型、连接处理、帧等底层细节进行抽象,提供跨越多种传输协议的套接字。ZMQ采用无锁的数据结构来存储消息,使用专门的后台线程处理消息数据,实现异步处理输入/输出(Input/Output,I/O)操作,因此具有良好的通信性能;ZMQ实现自动进行链路重连和消息缓存,对各个节点的启动顺序不作限制,而且可以自由地加入或者退出;ZMQ支持多种通信协议,包括传输控制协议(Transmission Control Protocol,TCP)、进程内、进程间等;ZMQ提供了请求-应答、发布-订阅、管道等多种消息通信模式,通过对各种模式组合使用,有效降低分布式系统搭建的难度。

2.2 ZMQ通信模型

ZMQ提供了3种基本的通信模型,分别是请求-应答、发布-订阅和管道模式。

(1)请求-应答模式。请求应答模式通信模型如图3所示。客户端使用REQ类型套接字,表示向服务端发起的请求;服务端使用REP类型套接字,表示对客户端请求的响应。这种模式下的通信过程是客户端先向服务端发送数据,服务端收到数据后向客户端发送响应,客户端收到响应后方可发送下一次请求。该模式下,客户端严格按照一发一收的模式进行通信,服务端则是严格按照一收一发的模式通信。这种模式对应了经典的客户端/服务端(Client/Server,C/S)模型,可用在远程过程调用(Remote Procedure Call,RPC)上[4]。

(2)发布-订阅模式。在消息中间件,发布-订阅是一种常见的模式。ZMQ中,消息发布者使用PUB类型的套接字,绑定到发布地址后即可进行消息发布。消息订阅者使用SUB类型套接字,连接到发布者的发布地址后即可开始订阅消息。消息发布者可以被多个消息订阅者连接,订阅者可以中途连接或者退出消息订阅[4]。发布-订阅模式的示意模型如图4所示。

(3)管道模式。管道模式(Parallel Pipeline)是一种分布式并行处理模型,结构如图5所示。这个模型由3种类型的节点组成:第1个是任务分发者(Ventilator),其使用PUSH类型套接字,负责任务(Tasks)的分发;第2个是任务处理/计算者(Worker),其使用 PULL和PUSH两种类型套接字,首先使用PULL类型套接字从Ventilator中获取任务,其次对任务进行处理/计算,最后把结果(Result)通过PUSH类型套接字推送出去;第3个是结果收集器(Sink),通过使用PULL类型套接字,从多个Worker中获取任务处理/计算结果。在管道模式中,一般有一个Ventilator节点、多个Worker节点和一个Sink节点,Ventilator会把任务平均PUSH到Worker。Sink节点也会公平地从Worker节点中获取结果[4]。

3 TPSBLIB设计实现

主题发布-订阅总线库(Topic Publish Subscribe Bus Library,T-PSBLIB)参考DDS模型,构建一个共享的全局数据空间,所有对该空间中的数据感兴趣的应用程序都可以加入。发布者加入数据空间后,通过总线库提供的接口发布主题数据,从而向数据空间提供信息;订阅者加入数据空间后,通过总线提供的接口订阅主题数据。每当发布者将新数据发送到这个全局数据空间,该总线库就会把信息发送给已订阅该主题的订阅者[5]。TPSBLIB节点对数据的访问示意如图6所示。

TPSBLIB采用分布式体系结构,每个参与节点都是相等的,具备发布主题数据、订阅主题数据和发现相同域中其他节点的能力。每个节点至少有一个域空间(Domain),域空间中有数据写入器(Data Writer)、发布器(Publisher)、数据读取器(DataReader)、订阅器(Subscriber)和节点管理器(NodeManager)。数据写入器和数据读取器是应用与中间件的交互实体,主要进行主题数据的写入和读取。下文对节点管理器、数据发布器和数据订阅器的设计进行介绍。

3.1 节点管理器

TPSBLIB通信库中,节点管理器的主要负责数据域中的节点发现信息更新与状态同步,包括两个部分的工作:一是定时广播自身的状态信息,这些信息包括节点名称、本节点发布的主题数据信息、本节点订阅的主题数据信息;二是接收处理其他节点广播的状态信息,并维护一个节点的状态信息表,实现对数据域中各个节点的状态管理,为节点对域中主题数据的发布订阅提供信息支撑。

节点管理器通过组播的方式进行通信,同一域中各个节点的节点管理器加入相同的多播组,定时向该多播组发送节点自身的状态信息,同时接收该多播组中的数据,获取其他节点广播的节点状态信息,并将收到的节点信息增加或者更新到节点信息表中[6]。节点管理器工作模式如图7所示。

3.2 数据发布器

数据发布器的主要功能是根据给定的质量策略建立相应的数据发布链接。同时根据主题数据的质量策略,把数据发送给已订阅该主题数据的订阅者。TPSBLIB中数据发布器主要由发送数据队列、发布控制器和数据发布接口链路3个部分组成(见图8)。

数据发布控制器是数据发布器的核心,管理和运行一个独立的数据发布线程。该线程从发送数据队列中获取待发布的主题数据,并将这些数据通过发布接口链路发送到已订阅主题的订阅者。

发布数据接口为数据写入器或者其他模块提供发布数据接口,对发送的数据按照特定的格式生成发送数据缓存,并把缓存相关信息写入发送数据队列。发送数据队列使用优先队列,每个待发送的数据都有一个优先级,发布控制器首先发布队列中优先级最高的数据。当发送数据队列没有数据的时候,发送控制器定时发布心跳消息,表明数据发布器在正常工作。

为了支持不同质量属性主题数据的发布订阅,TPSBLIB中提供两种策略的发布链路:可靠发布链路和非可靠发布链路。可靠发布链路使用TCP协议,保证数据可靠的发送到订阅者;非可靠链路使用用户数据报协议(User Datagram Protocol,UDP)协议,占用的网络带宽比较少,但是不能保证所有订阅者都收到完整的数据。

TPSBLIB中,数据发布接口链路采用ZMQ网络库的PUB类型套接字,相比于直接使用socket进行接口链路实现,有效降低底层物理链路管理的复杂性。

3.3 数据订阅器

TPSBLIB中,数据订阅器由订阅链路管理、数据接收处理、数据派遣处理、接收数据队列和数据订阅链路等部分组成,如图9所示。

订阅链路管理根据本节点订阅的数据主题,自动与发布器建立通信链路,在数据发布器下线或者对应的主题数据取消订阅的时候,断开与该发布器的连接链路。数据接收处理建立一个独立的数据接收线程,等待并读取订阅链路中的数据,并根据约定数据格式,对数据进行解析,恢复出完整的主题数据信息,并将这些主题数据写入接收数据队列。为了提高数据接收处理的稳定性,数据派遣处理建立一个数据派遣线程。该线程从接收数据队列中读取数据,并把数据发送给相应的数据读取器提供的主题数据处理者。

TPSBLIB中,数据订阅链路使用ZMQ网络库的SUB类型套接字,与数据发发布链路的PUB类型套接字配合应用,实现各个节点上下线的顺序无关处理。

3.4 TPSBLIB实现

TPSBLIB的实现参考DDS的类结构,并根据上文设计对其进行调整简化,类结构体如图10所示。图10中DomainParticipant主要实现上文中的节点管理器功能,Publisher实现发布器的功能,Subscriber实现订阅器功能[7]。

为便于应用开发,TPSBLIB提供配置文件对中间件相关信息进行配置,并通过提供简单接口对中间件进行访问控制,从而极大地提高应用开发的便捷性和高效性。

配置文件采用XML格式。配置内容包括节点信息配置、域信息配置、发布器与发布主题配置、订阅器与订阅主题配置等信息。配置文件格式如下所示。

应用接口层为应用提供简单的接口,包括中间件初始化、设置主题数据接收回调、发送主题数据、关闭中间件4个,应用接口函数声明如下文。

void initSDDS(void);

typedef void recvSDDSTopicData(char* topic,char* source, char* data, int len);

void setSDDSTopicDataRecver(recvSDDSTopicDa ta* recv);

void sendSDDSTopicData(char* topic, char* data,int len);

void closeSDDS(void);

4 结 语

本文分析设计和实现了一个简单数据发布订阅通信库(TPSBLIB),该通信库参考DDS规范相关的概念与思路,并在ZeroMQ(ZMQ)网络库的基础上进行实现。TPSBLIB采用数据发布订阅通信模式,并提供数据可靠传输和非可靠传输两种策略,基本满足小规模分布式应用系统对信息交换实时性和灵活性的需求。

猜你喜欢

发布者管理器链路
一种移动感知的混合FSO/RF 下行链路方案*
基于凸优化的FSO/RF 自动请求重传协议方案
天空地一体化网络多中继链路自适应调度技术
启动Windows11任务管理器的几种方法
新加坡新法规引争议
应急状态启动磁盘管理器
在微信朋友圈买到假货,该如何维权?
一种IS?IS网络中的链路异常检测方法、系统、装置、芯片
用好Windows 10任务管理器
网络大V转发违法广告须担责