一种基于冗余网络异步通信的高可靠数据传输方法与流程

文档序号:19951125发布日期:2020-02-18 10:32阅读:186来源:国知局
一种基于冗余网络异步通信的高可靠数据传输方法与流程

本发明属于软件领域,涉及一种异步传输基础上的冗余网传输方法



背景技术:

随着互联网技术的发展与分布式技术的成熟,分布式系统的应用已广泛普及,而分布式系统最优先解决的是大规模的信息传输与消息的实时性以及可靠性,比如我们有一个指挥中心要指挥一批运输车队,车队在地域上分布是比较广的,但是我们指挥车队时要求比较高的实时性,这就要求消息的传输效率要高。另一种情况,如部队指挥作战,指挥中心发送给各个部队的消息必须要求准确无误,但是消息在发送过程中可能会受到收到干扰导致传输的消息出现错误,为保证消息的准确性,这就要求传输通道要加强对传输消息可靠性上的处理。

分布式系统多是以网络为传输媒介,但是网络的开放性和不确定性却严重的影响着数据的传输,在分布式系统进行数据传输时要考虑传输的完整性和可靠性以及不同需求下数据的传输速率需求,通常情况下解决方案是接收方收到消息后进行完整性校验并发送ack给发送方确认收到消息,如果收到的消息有误就要求消息重新发送。但是这种方法在传输效率上比较低,并且在网络环境比较差的情况下容易出现断开连接的情况。



技术实现要素:

为了解决消息传输的效率和传输可靠性等问题,本发明设计了一个基于异步通信的tcp传输的双网冗余网传输通道,通过双网的协调传输,实现了消息传输的高效率和高可靠性。

本设计是一个用于数据高可靠传输的传输通道,当传输终端向数据中心请求数据时,可以通过传输通道进行消息收发,应用场景示例如图1所示。

为了实现这个传输通道,我们总共设计了四个部分,第一部分是用于消息解析和处理的channel层部分,channel层负责客户端和服务端数据传输的解析与处理,channel分为客户端通道clientchannel和服务端通道serverchannel。为了避免消息传输逻辑过于复杂,我们规定了clientchannel和serverchannel几种状态,让channel在不同的状态下去发送或处理不同的消息,也就是有了控制channel的状态机的设计,数据接收双方要进行数据的交互就要涉及到数据的发送与接收动作,所以我们设计了collection层,用于数据的发送与接收,channel层会调用collection层的发送和接收函数进行数据的发送与接收。为了提高传输的效率,在collection层我们选择了使用asio的异步传输机制,但是在使用异步传输机制之后,发送方与接收方收发消息不能保持同步,发送或者接收的消息需要缓存起来,所以我们设计了发送队列队列用于消息的缓存,collection层在发送数据的时候会从发送队列去一个数据进行发送,在接收到数据后会将数据放入接收队列。

传输通道有两种连接方式,单网传输通道(simplechannel)和双网冗余网传输通道(redundantchannel)(channel层会详细介绍),单网传输通道分为单网客户端通道(simpleclientchannel)和单网服务端通道(simpleserverchannel),双网冗余网传输通道分为双网客户端通道(redundantclientchannel)和双网服务端通道(redundantserverchannel),分类如图2所示。数据中心与终端内部包含客户端与服务端,用于与其他的客户端和服务端连接。数据请求的终端和数据中心用可以采用双网传输通道连接或者单网传输通道,图中示例在终端与终端之间上使用双网传输通道连接,数据中心之间使用单网传输通道连接,由于双网传输通道与单网传输通道不能够直接连接,所以有了图中连接桥的设计,当通信双方存在一方使用双网传输通道,一方使用单网传输通道的时候,需要使用连接桥进行转接,连接桥包含单网传输通道的接口和双网传输通道的接口,其内部不对传输的数据做处理,直接从消息传来的另一个接口转发出去,用以实现传输双方的数据交互,也就是说转接桥的功能仅仅是连接通信的两端并进行消息转发。

终端与数据中心进行数据交互要经历两个阶段,连接阶段和普通消息交互阶段。在连接阶段,客户端会向服务端发起连接请求,根据发送的消息不同控制channel的状态机进行状态转换直到进入连接状态,之后进行普通消息交互。

数据中心之间转接桥是用来连接两个数据中心,用于数据中心的数据交换,它抽象出了数据中心的客户端接口,用于向数据中心发送注册消息请求数据。

channel层单双网通信通道设计

在设计上,channel只要分为四种,单网客户端通道,单网服务端通道,双网客户端通道和双网服务端通道。

channel层是负责消息进行传输的通道,用于对不同消息的处理与解析,为了实现消息的传输以及传输的可靠性,我们设计了单网传输通道和冗余网传输通道,单网传输通道就是使用asio库内部函数使单网客户端通道和单网服务端通道建立的一条网络连接,双网冗余网传输通道内部包含两条这样的网络连接,但是在应用层的表现上来看,此设计是隔离了单网和双网的区别,应用层的应用并不知道自己是通过单网与对方应用连接还是通过双网与对方应用连接的。并且channel层的通信方式分为tcp通信和unix通信两种方式。

单网传输通道实现了一个典型的tcp网络传输,它传输的可靠性是通过发送一个data就回复一个ack来保证的。每次发送的消息都会规定一个唯一的编号,并且每发送一个消息就需要等待接收方回复这个消息的ack来确认接收方是否确实的收到了这个消息,如果一定时间内没有收到这个消息的ack就认为消息已经丢失,发送方会对消息进行重新发送,比如我们发送了一号消息和二号消息,但是却只收到了一号消息的ack,说明二号消息已经丢失,这就会促使发送方重新发送二号消息。

为了实现消息的可靠传输,设计上对消息进行了处理,在消息发送的时候添加了消息头,消息头包含了消息编号以及消息来源等信息,并且在接收方会记录已接收到的消息的序号,如果收到的消息的序号不连续,则说明消息已经丢失需要发送方重新发送。

双网传输通道在设计上有两种模式,一个是传输效率优先模式,一个是消息可靠性优先模式。效率优先和可靠性优先两种模式的区别主要体现在接收方如何处理双网传输通道内部的两个单网传输通道传来的消息。在传输效率优先的模式下,我们不要求两个单网传输通道都正常连通并且要求两个通道发过来的消一致,只需要保证传输过来的消息序号连续。接收方收到的消息只要序号连续,就认为消息没有丢失。比如当前服务端已经接收到了三号消息,两个单网传输通道分别来了四号和五号消息,由于消息编号是连续的,服务端就会把这两个消息都进行接收存储,并把已接收到的消息序号更新为五表示最新收到的消息序号为五。这两个单网都是各自发送各自的消息,但是消息的序号是双网统一管理的序号,比如我们要通过双网发送一号消息,那么这两个单网就都是发送一号消息,对于接收方,若其中一个单网接收到了一号消息,另一个单网接收到了二号消息,我们应该看这个接收方上一次收到的消息是什么,如果上一次收到的消息是一号消息,那么我们认为再次接收到的一号消息是冗余的,此时应该将记录更新一下,最新消息是二号消息并且忽略第二次收到的一号消息。若一个网收到了三号消息,一个网收到了四号消息,则说明二号消息丢失,直接将三号消息和四号消息丢弃,并回复ack请求重新发送二号消息。但是在消息可靠性优先的模式上,接收方就要求每次收到消息的时候,两个单网传输通道传过来的消息应该是一致的,不仅是消息序号一致,消息的内容也要一致。如果两个单网传输通道消息的传输效率不一致,那么发送快的一方会等待发送慢的一方,等到两个单网传输通道的消息全都到了再比较两个消息的一致性,不一致则直接将消息忽略并请求重新发送,一致则对消息进行接收存储并更新已接收到的消息序号。

在网络连通上,客户端会向服务端定时的发送heartbeat,来监听网络是否处于连通状态,一旦网络连接断开,客户端会重新向服务端发起连接请求。一旦双网传输通道的某一个单网断开连接之后,这个单网的客户端会主动的向服务端发起重连请求来保证传输通道的连通性。

双网传输的设计使得消息的传输更为可靠,首先,设计上给每一条发送的消息规定了唯一的编号,确保了每条消息的唯一性。其次,在传输效率优先的模式下,双网传输通道内的任何一个单网通道断开连接都不会影响到消息的正常传输,只要有一个单网传输通道连通,客户端和服务端就可以正常进行消息的传输。而且在两个单网传输通道都连通的情况下,接收方可最多一次收到两个被请求的消息,提高了传输的效率。而在消息可靠性优先的模式下,设计上要求只有当两个单网传输通道传来的消息完全一致才算完成了一次有效传输,这样可以减小在消息传输过程中因干扰或其他因素导致消息出错的情况,使传输的消息的正确性得到提高。

在channel层,我们需要处理的消息种类有注册消息,注册消息回执ack消息,heartbeat消息,普通数据消息,在消息发送前会在需要发送的消息前添加head信息,用于接收方辨别收到的是哪种消息,所以消息的接收方在收到消息后会先解析头部消息,判断消息种类,根据消息种类去执行后续操作,不同的消息有不同的操作,如果收到的是普通数据消息或者注册消息,就继续进行消息本体的解析,在消息头部会保存消息本体的长度信,用于完整解析消息的本体。对于heartbeat和ack类消息,由于heartbeat和ack不需要携带其他额外信息,只需要告知对方连接是否正常或者上次接收到的消息序号是多少,所以这两类消息质包含消息头部,没有本体消息。

对于tcp通信和unix通信两种方式,unix的优点是数据传输效率很高,但是只能进行本地通信,所以设计上两台设备处于不同地点,即两台需要通信的设备在地理位置上相处距离比较远,就采用tcp通信方式,如果需要数据交互的终端之间就是本地传输,就采用unix通信。由于unix通信几乎不存在网络断开的情况,所以在本地的终端设备采用unix通信。

状态机设计

在消息传输的过程中,由于网络变化很快而且是不可预知的。为了避免状态的变化以及减少channel层在处理数据时的复杂逻辑,我们运用了状态机的机制来管理channel不同的状态,使channel在不用状态下处理不同的事件。这样做减少了channel层对消息传输使的复杂逻辑判断,使传输结构更加清晰。由于总共分为四种channel,所以我们设计了四种状态机分别控制这四种channel。

对于单网传输通道,客户端和服务端的channel分别定义了不同的状态。单网客户端通道定义了五种状态,分别是未连接(disconnect)状态,连接中(connecting)状态,registering(注册中)状态,等待注册回执(waitingregisterack)状态和已连接(ready)状态,在不同的状态中仅需处理当前状态所需处理的事件,在启动程序的时候状态机会初始化进入未连接状态,在未连接状态下会向服务端发起连接请求,并将channel状态转换为连接中状态并且等待服务端接收到连接请求后的回执消息,若成功收到服务端的回执消息则将状态转换到注册中状态准备发送注册消息,否则状态转换到未连接状态并再次发起连接请求。在注册中状态时客户端会向服务端发送注册消息,注册消息包含客户端的id等信息,发送成功则状态转换为等待注册回执状态,如果发送注册消息失败则直接将状态转换回未连接状态并重新向服务端发起连接请求。在等待注册回执状态中若收到了服务端注册成功的消息,则将状态转换到已连接状态,若未收到ack则同样将状态转换回未连接状态。在已连接状态下客户端和服务端就可以开始接收发送消息了,一旦接收或者发送失败,将状态机状态转换到未连接状态。单网客户端channel状态转换如图3所示。

单网服务端通道在设计上定义了三种状态,未连接(disconnect)状态,发送注册消息回执(sendingregisterack)状态和已连接(ready)状态。同样的服务端的channel在初始化的时候会进入到未连接状态等待客户端的连接请求,在收到连接请求后会向客户端发送连接请求回执但并不进行状态转换,会继续等待客户端的注册消息,服务端在收到客户端的注册消息后状态机状态转换到发送注册消息状态,在发送注册消息回执状态向客户端发送注册消息的ack表示已接收到注册消息,如果注册消息的ack发送成功则将状态机状态转换到已连接状态,ack发送失败则将状态机状态转换为未连接状态。单网服务端channel状态转换如图4所示。

双网传输通道的状态机状态依赖于单网传输通道状态机的状态,双网是用来管理两个单网状态机的,它内部包含两个单网传输通道,相当于把单网的状态进行了汇总。双网客户端和服务端有两个状态,未连接状态(disconnect)和已连接状态(ready),对于双网客户端,在初始化的时候会建立两个单网客户端,双网客户端向双网服务端发起连接请求即是两个单网客户端发起连接请求。由于双网的状态机有两种模式,传输效率优先模式和消息的可靠性优先模式,在效率优先的模式下,当某一个单网客户端进入已连接状态之后即标志着双网客户端进入已连接状态,双网服务端也是同样的道理,当任何一个单网服务端进入已连接状态就标志着双网服务端进入已连接状态。但是在消息可靠性优先的模式下,只有当两个单网传输通道全都进入已连接状态的时候,双网的状态机才转换到已连接状态。双网客户端(服务端)的状态转换如图5图6所示。

本设计在客户端和服务端发起连接到已连接状态的整个过程中,客户端发起异步连接操作,服务端收到连接请求并成功发送异步连接回执时,客户端和服务端已经可以正常收发消息,但是我们并没有把channel状态转换到已连接状态,原因在于客户端需要去服务端去进行注册,要告诉服务端是谁向它请求了消息,服务端与客户端的连接是一对多的关系,所以就有了中间发送注册消息与注册消息回执的过程,注册消息即是向服务端表明自己的身份,因此在客户端和服务端收发注册消息和注册消息ack后channel状态机才会转换到已连接状态。在进入已连接状态后,客户端同样需要向服务端发送新的注册消息,这个注册消息是客户端向服务端请求的消息类型,客户端要告知服务端自己所需要哪些消息,服务端知道客户端请求的消息后才能向客户端发送普通数据消息。

使用状态机的好处在于使用一个单独的对象管理了channel的状态,不需要在每次发送消息的时候判断是否收发送了ack等复杂判断,只需要判断channel是否处于连通状态。极大地简化了处理各种数据的逻辑性,减少了整个数据传输过程中的复杂逻辑问题,提高了代码的健壮性与可读性。

collection异步通讯模块

在消息的传输方式,设计上采用的是异步传输机制。消息传输可以分为同步方式和异步方式,同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用。而异步调用是一种类似消息或事件的机制,接口的服务在收到某种讯息或发生某种事件时,会主动通知调用方。

本发明设计使用的是asio异步收发机制,在消息需要发送或接收的时候直接调用asio库内部的异步发送和异步接收函数。在channel将要发送的消息添加好头部信息后就会调用collection里的异步发送函数进行发送,在需要进行消息接收时就调用异步接收函数进行接收。

当调用asio的异步发送函数发送消息时,调用者在发送消息以后可以不用等待响应,可以接着处理其他任务,它会将这些事件交给操作系统,操作系统处理完后会将事件丢到asio的事件完成队列中。对于异步通信,一个应用程序(请求者或发送者)将请求发送给另一个应用程序,然后可以继续向下执行它自身的其他任务。发送程序无须等待接收程序的执行和返回结果,而是可以继续处理其他请求。与同步方式不同,异步方式中两个应用系统(发送程序和接收程序)无须同时都在运行,也无须同时都在处理通信任务。

使用异步通信机制,使我们在设计上摒弃了传统的while监听模式读取消息,在传统的while监听模式上,我们往往都会使用一个死循环,然后规定一时间,让接收方定时的去查看是否有消息到达,但是使用异步通信机制后,这一步骤就交给了操作系统去完成,接收方只需要在需要使用消息的时候来取消息就可以了,这种非阻塞式的发送接收机制很大程度上提高了发送和接收的效率。

在本设计中,我们单独设计了collection模块用来进行异步发送与接收的操作,channel层需要收发的消息最终均由collection层的接口函数进行发送或接收。

使用异步发送机制,接收双方均不需要等待对方,在数据发送动作发出以后之后的事情交由操作系统完成,接收双网可以去处理其他事情,使线程不会阻塞,提高了数据的传输效率。

发送队列与接收队列设计

由于异步传输机制会导致接收双方交互数据不同步,可能会导致消息的堆积,为了适应异步传输机制,我们设计了发送队列和接收队列,发送队列和消息队列是两个list,存放需要发送或者接收到的数据。发送数据时,channel层会对要发送的数据进行处理,比如添加头部信息,处理好之后会将消息放入发送队列,然后collection层会将发送队列里的消息逐个发送,接收的时候同样的道理,channel层收到消息后将消息放入接收队列,由应用层根据需求来取数据。

发送队列也由一个状态机控制,状态机的状态只有两个状态,空状态(empty)和非空状态(nonempty),当客户端或服务端要发送消息的时候,此时会将需要发送的消息放入发送队列,此时发送队列已经不为空,将状态机状态转换到非空状态,并开始准备发消息,一旦发送队列内的消息为空时,将状态机状态转换到空状态。发送队列状态转换图如图7所示。

在消息队列里可能会发送两种消息,一种是heartbeat和ack这种监听提示类消息,heartbeat用于监听网络是否处于连通状态,ack用于回复发送方已接收到的消息,这两用消息保证消息传输的可靠性,第二种消息就是普通的消息类消息,每次发送消息的时候会判断消息队列是否为空,发送队列不为空则调用异步发送操作进行真正的消息发送,发送成功后马上调用下一次异步发送并且发送队列会将已发送的消息移除队列防止消息的重复发送

由于我们要对每个发送的消息进行编号,但是真正执行异步发送的时间是不确定的,这就导致如果出现两个消息要同时发送的时候,消息编号会出现混乱导致发送的消息不准确,发送队列将消息强制性的排队,真正执行异步操作的时候按消息队列的顺序发送消息,使发送的消息按序发送,提高消息的准确性。

对于接收队列,接收方订阅的消息收到之后并不会直接发送给应用,而是先缓存在接收队列里,接收队列留有一个消息获取函数,当应用需要获取消息的时候再来接收队列获取消息,这么做的好处是避免消息接收出现阻塞,接收方向发送方订阅消息然后来处理,但是如果处理的消息比较复杂,导致消息处理的速度没有消息接收的快,如果不设置一个接收队列,那么接收方必定会出现阻塞现象,添加了接收队列也使传输效率得到提高。

有益效果

本发明通过使用双网传输通道进行数据传输,使数据传输更为效率可靠,在效率优先的模式下,双网传输即使在断掉一条内部单网传输通道的情况下也能继续进行数据的传输,而在可靠性优先的模式下能够保证数据的准确性,通过对双网内部两个单网传输通道传来的数据进行校验比对能够很好的对数据进行正确性检验,使传输的数据更加准确,而通过使用异步传输机制,也使得数据的传输效率得到了提高。

附图说明

图1:应用实例示意图

图2:channel层分类图

图3:单网客户端状态转换图

图4:单网服务端状态转换图

图5:双网客户端状态转换图

图6:双网服务端状态转换图

图7:发送队列与接收队列状态转换图

图8:单网客户端通道发送注册消息流程图

图9:单网服务端接收注册消息并发送注册消息回执流程图

具体实施方式

以单网客户端向单网服务端发送注册消息为例,单网客户端通道内的状态机在转换到发送注册消息状态之后会调用channel内发送注册消息的函数,在这个函数内进行消息预处理,给注册消息添加头部消息,预处理消息之后将消息放入发送队列,发送队列通过调用collection异步通信模块的异步发送函数进行数据发送,数据发送成功之后单网客户端状态机会调用自身的状态转换函数将状态进行转换,转换到等待注册回执状态,并调用channel内的接收注册消息回执函数进行消息接收,单网客户端通道发送注册消息如图8所示。单网服务端通道在收到发来的注册消息后在channel内进行解析,并把消息存入接收队列,然后通道内部的状态机调用发送注册消息回执函数给单网客户端发送注册消息回执,发送成功后状态机进行状态转换,进入到已连接状态,单网服务端通道接收注册消息如图9所示。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1