NPU_RTI软件框架设计
RTI主要分为LRC和RTI两大部分,总体的逻辑结构分为五部分:LRC请求消息队列、RTI请求消息队列、RTI处理行为队列、LRC行为回调队列、LRC和RTI网络连接。
为了更好的理解每一个组件的工作过程,这里通过联邦成员注册同步点请求在NPU_RTI系统中的消息流进行说明,示范消息在系统中的流向和响应。
Step1:LRC处理用户请求
通过分析LRC处理用户的请求过程,理解在联邦运行中,
RTI大使在调用registerFederationSynchronizationPoint时的消息处理过程。当RTIAmbassador接收到联邦成员的请求,根据请求类型,该请求被转换为某个类型的消息对象实例。LRC在创建该消息实例后,将该消息实例添加到LRC请求队列,如果LRC请求队列中存在消息,则消息管理器将进行处理。因为消息会在网络中进行传递,对于系统来说这是一个相当昂贵的任务,所以在LRC一侧消息管理器首先验证队列中的消息的合法性,以减少网络数据交换。然后针对不合法的消息抛出异常,而对合法的消息进行打包,然后根据相应的传输方式通过网络连接发送到RTI。RTIAmbassador调用要求返回响应。虽然在很多情况下,该响应返回空值,但是,LRC必须阻塞到接收到来自RTI的消息接收到或者错误响应。
下图显示LRC处理联邦成员请求的过程。
LRC处理用户请求
Step1.1:联邦成员发出registerFederationSynchronizationPoint请求;
Step1.2:RTIAmbassador接收到该请求,创建相应消息请求;
Step1.3:RTIAmbassador将该消息添加到LRC的消息队列中;
Step1.4:LRC请求队列存在消息,则由消息管理器进行处理;
Step1.5:在消息管理器验证消息合法性;
Step1.6:将验证后合法的消息打包通过LRC发送到RTI
Step2:RTI处理用户请求
一旦请求消息通过网络链接被发送RTI,RTI则开始处理该消息。RTI服务器将该消息实例添加到本地的LRC消息请求队列中,如果消息队列中存在消息,则消息管理器进行消息处理,如果该消息解包后能够通过消息句柄验证, 则该消息立即被处理或者如果正在处理其它消息,则此消息延后处理。
处理消息的方式依赖于具体的消息处理方式。通常情况下,如果请求通过回调方式处理,则将该消息加入到行为队列中进行异步处理,释放句柄然后产生适当的响应消息传递给等待的LRC。如果请求不通过回调方式处理,仅仅是一个信号,则RTI处理后,传递一个请求是否成功的响应。如下图所示:
图RTI处理用户请求
Step2.1:通过LRC接收到请求同步点注册消息;
Step2.2:消息被传递到RTI请求接收器;
Step2.3:RTI消息处理根据消息的类型发送给相应的消息处理器;
Step2.4:RTI进行消息解包进行验证;
Step2.5:如果是回调方式处理,创建新的消息并放置到行为队列中;
Step2.6:创建成功的消息响应或者错误返回给RTI;
Step2.7:给LRC发送相应的消息响应;
Step3:RTI到LRC的响应
如下图所示,说明RTI返回给LRC响应的处理过程。一旦LRC连接接收到来自RTI的消息响应,则消息处理器检测该消息响应。如果响应表明是成功,则本地记录该消息。例如,当联邦成员禁止时间受限,成功消息将影响LRC去记录变化在本地LRCState,如果响应表明失败,它将抛出异常。消息处理器将消息处理结果返回给LRC请求接收器,该接收器继续将结果传递给RTIambassador,此时RTIambassador将响应结构返回给联邦成员,至此完成一个消息的请求与响应的全过程。
图RTI到LRC的响应
Step3.1:LRC连接接收来自网络连接的响应;
Step3.2:消息响应的处理;
Step3.3:消息处理器处理消息,如果成功,局部记录,如果失败,忽略;
Step3.4:消息处理器将该消息的处理结果返回给LRC请求接收器;
Step3.5:LRC请求接收器将该消息的响应结果继续传递给RTIAmbassdaor;
Step3.6:RTIAmbassdaor返回给联邦成员一个消息或者成功或者异常;
Step4:RTI大使处理回调请求
上面已经看到了一个请求的全部处理过程,下面把注意力转向第二步中提到的回调处理。如下图请求实例在RTI中被创建并且被添加到到行为队列中进行异步处理。此请求消息队列主要响应仿真回调,这些回调被异步发送到LRC并且传输到FederateAmbassador
回调中。消息处理器从
行为队列中获取请求,根据请求类型进行处理。如注册同步点请求,消息处理器针对每一个联邦创建一个回调。发送回调是一个耗时昂贵的I/O调用任务。所以这里采用异步处理,每个独立的行为处理线程对应于一个联邦成员,即发送回调消息是完全独立的。这样的处理方式能够确保处理即将到来的消息而不是在I/O运行上浪费时间,从而提高系统实时性。
图 RTI大使处理回调
Step4.1行为队列处理器从消息队列中获取请求,然后传递给RTI行为接收器;
Step4.2RTI行为接收器传递请求到响应的消息处理器;
Step4.3消息处理器执行消息处理;
Step4.4对于每个联邦成员,创建一个回调宣布点然后排队等待;
Step4.5创建异步线程,进行消息处理;
Step4.6回调通过RTI链接发送消息;
Step5:联邦大使处理回调
此过程说明联邦大使在LRC侧触发回调。如下图所示,此过程一是管理来自RTI的回调消息,另一个是分发回调消息到联邦大使。
当LRC接收到回调消息,将回调消息加入到LRC队列中。一旦消息被加入到LRC回调队列中,发送成功的响应到RTI,回调处理器处理处理下一个回调。
当联邦成员准备好接收回调,它通知RTI大使通过tick方法。象其它行为处理器,此时将LRC队列中的第一个可用的消息传递给LRC回调队列,然后消息管理器进行消息处理,从而触发联邦大使的调用,通知联邦成员完成响应的功能。
图 联邦大使消费回调
Step5.1通过网络连接,LRC连接获取到来自网络消息;
Step5.2LRC连接将消息放置到LRC队列中;
Step5.3线程tick;
Step5.4RTI大使从LRC队列中获取到一个可用的回调消息;
Step5.5RTI大使传递回调消息到LRC回调接收器;
Step5.6LRC回调接收器将消息传递到适当的消息处理器;
Step5.7触发联邦大使回调给联邦成员;
以上描述基本说明了RTI的工作过程,接下来将是每一块的设计思路。