首页> 中国专利> 一种交易系统内部高可靠消息传输方法

一种交易系统内部高可靠消息传输方法

摘要

本发明涉及数据传输技术领域,具体来说是一种交易系统内部高可靠消息传输方法,包括发送端和接收端,接收端和发送端内部均需要维护一个缓存区,缓存区采用ringbuffer队列构造,缓存区设置了一个全序的指针队列和多个数据队列,全序指针队列有四个控制指针:待写入指针、待发送指针、待确认指针、已处理指针;四个指针的大小关系为:待写入指针≥待发送指针≥待确认指针≥已处理指针。本发明所提供的一种交易系统内部高可靠消息传输方法实现难度较低,且能够在保证高效通信的前提下,任意节点发生故障,均可以保证数据不丢失,不重复,且传输过程中数据顺序一致。

著录项

  • 公开/公告号CN112162875A

    专利类型发明专利

  • 公开/公告日2021-01-01

    原文格式PDF

  • 申请/专利权人 上交所技术有限责任公司;

    申请/专利号CN202011083759.2

  • 发明设计人 叶峰;王泊;孙增;

    申请日2020-10-12

  • 分类号G06F9/54(20060101);G06Q40/04(20120101);

  • 代理机构31127 上海三方专利事务所(普通合伙);

  • 代理人吴玮

  • 地址 200131 上海市浦东新区中国(上海)自由贸易试验区台中北路8号

  • 入库时间 2023-06-19 09:24:30

说明书

技术领域

本发明涉及数据传输技术领域,具体来说是一种交易系统内部高可靠消息传输方法。

背景技术

对于线上交易系统,其信息传输要求低时延,高吞吐量以及高效的故障恢复能力。传统的基于broker的消息队列,例如Kafka,RabbitMQ等,由于在信息传输的过程中需要通过代理,因此需要额外的网络通信时延,造成通讯延迟,现如今,基于点对点的传输是目前交易系统的主流方向。而基于点对点的数据传输,需要解决如何进行一对多发送,定序,选主,数据补传等在线上交易信息传输中需要解决的问题。

发明内容

本发明的目的在于解决现有技术的不足,提供一种基于组播的高可靠数据传输方案,以解决现有技术中对于线上交易系统点对点传输存在的问题

为了实现上述目的,本发明所采用的交易系统内部高可靠消息传输方法包括发送端和接收端,接收端和发送端内部均需要维护一个缓存区,缓存区采用ringbuffer队列构造,缓存区设置了一个全序的指针队列和多个数据队列,全序指针队列有四个控制指针:

待写入指针:下一个被发送数据写入的位置,小于该指针的数据均需要被发送;

待发送指针:该指针表示大于等于该指针的数据需要被发送;

待确认指针:小于该指针的内容表示传输完毕;

已处理指针:接收端将数据交给业务层处理的位置;

这四个指针的大小关系为:待写入指针≥待发送指针≥待确认指针≥已处理指针。

本发明还具有如下优选的技术方案:

进一步的,所述发送端包括Node1_*和Node2_*,Node1_*和Node2_*发送的是两份不同的数据,Node1_*中,Node1_1和Node1_2为一主一备,发送端中,主对外发送数据,备不对外发送数据,发送端主备都接收接收端发送的ack/nack控制消息。

进一步的,所述接收端包括Node3_*,Node3_*需要同时接收Node1_*,Node2_*发来的数据,Node3_*中Node3_1,Node3_2,Node3_3为主备关系,主节点开始接收发送端的数据,并将接收下来的数据进行全局编号,同时,将数据转发给备节点,此时,备节点不接收发送端的数据,而是接收接收端主节点的数据,接收过程中,间歇性发送ack消息,接收端主节点确认所有备节点接收完毕后,向发送端发送ack确认。

进一步的,所述ack消息向前移动待确认指针,确保这个指针前的数据接收方已经全部收到;假设ack消息传输顺序号为N,待确认指针设为N+1;ack消息向后移动待发送指针,用来补全丢失的数据。假设上次确认后,发送数据全部丢失,此时,待发送指针移动到待确认指针位置。

进一步的,ack消息无需保证高可靠传输。发送端只要收到有更大顺序号的ack出现,就可以移动已确认指针,将小于ack顺序号的缓存数据交给下游业务处理逻辑。

进一步的,所述nack消息无需保证高可靠传输。接收端只要发现数据跳号或丢失,定时发送nack消息,直至丢失顺序号补全。

进一步的,所述发送端发给接收端的每个主题数据都要求提供从0开始的顺序号。接收端通过顺序号,过滤重复数据。

进一步的,所述接收端主节点收到主题数据后,进行四步操作:

a.判断主题数据是否重复,如果重复,忽略数据;

b.判断主题数据是否跳号,如果跳号,发送nack消息,nack消息中携带要求发送的数据主题以及顺序号;

c.完成a,b步骤后,将主题数据按顺序插入对应主题数据的数据缓冲区中;

d.完成c步骤后,为数据编制一个全局顺序号,插入全序队列,全序队列存放一个数据指针,该指针指向具体数据。

本发明的有益效果

本发明所提供的一种交易系统内部高可靠消息传输方法的优点包括:

1、实现技术难度较低

根据本发明的设计,节点间数据传输可以选用开源OpenPGM或原生UDP组播,以降低了对网络传输的安全要求。

发送端和接收端的选主可以通过etcd或zookeeper来进行。通过成熟的选主算法降低了实现难度。

2、高效的通信

本发明的技术方案中,在保证数据不丢失的条件下,数据传输和确认不必每条数据都答复确认消息,减少了带宽和对网络的可靠性要求;在发送端和接收端间传输数据以及接收端主备间传输数据,采用了组播模式,减少了网络带宽和数据同步的传输时间;同时通过ringbuffer队列和ack/nack机制,保证了数据不丢失,同时减少了发送端和接收端的内存占用量。

3、高可靠性

本发明所采用的技术方案阐述了一种多副本可容错的数据传输方案,任意节点故障,均可以保证数据不丢失,不重复,且传输过程中数据顺序一致。

附图说明

图1示例性示出了本发明的消息传输模型示意图;

图2示例性示出了本发明的缓存区结构示意图;

图3示例性示出了本发明的发送端异常状态示意图;

图4示例性示出了本发明的接收端异常状态示意图;

图5示例性示出了本发明的触发选主状态示意图;

图6示例性示出了本发明的恢复通信时的示意图;

具体实施方式

下面结合实施例,对本发明所采用的技术方案做进一步的说明。

本发明所述的一种交易系统内部高可靠消息传输方法,包括了发送端和接收端,参照图1所示,Node1_*、Node2_*为发送端,Node1_*、Node2_*发送的是两份不同的数据,图1中显示为数据1和数据2。Node1_*中,Node1_1和Node1_2为一主一备,具体哪个为主,通过选主算法决定。发送端中,主对外发送数据,备不对外发送数据;但是,发送端主备都接收接收端发送的ack/nack控制消息。

Node3_*为接收端。图1中,Node3_*需要同时接收Node1_*,Node2_*发来的数据。Node3_1,Node3_2,Node3_3为主备关系。主备关系通过选主算法决定。当主节点确定下来之后,主节点开始接收发送端的数据,并将接收下来的数据进行全局编号,同时,将数据转发给备节点。此时,备节点不接收发送端的数据,而是接收接收端主节点的数据,接收过程中,间歇性发送ack消息。接收端主节点确认所有备节点接收完毕后,向发送端发送ack确认。

接收端和发送端内部均需要维护一个缓存区,缓存区结构如图2所示。缓存区采用ringbuffer队列构造。缓存区设置了一个全序的指针队列和多个数据队列。全序指针队列有四个控制指针:

待写入指针:下一个被发送数据写入的位置。小于该指针的数据均需要被发送;

待发送指针:该指针表示大于等于该指针的数据需要被发送。考虑到接收方可能会漏掉数据,此时,收数据的一方会发送nack消息,要求重传数据;收到nack消息后,发送一方需要修改待发送指针的值,最极端的情况是,将待发送指针改到待确认指针位置;

待确认指针:小于该指针的内容表示传输完毕。待发送指针到待确认指针中间的数据表示已发送,但未确认。ack消息可以移动待确认指针。假设ack消息传输顺序号为N,待确认指针设为N+1。

已处理指针:接收端将数据交给业务层处理的位置,“待确认指针-已处理指针-1”的数量是待处理的数据个数。

这四个指针的大小关系为:待写入指针≥待发送指针≥待确认指针≥已处理指针。待写入指针=已处理指针表示队列为空。mod(待写入指针,队列大小)=mod(已处理指针,队列大小)-1表示发送端缓存区已满,入队操作进入等待状态,保证了数据不丢失。

ack和nack消息可以对指针进行修改:

ack消息向前移动待确认指针,确保这个指针前的数据接收方已经全部收到;假设ack消息传输顺序号为N,待确认指针设为N+1。

nack消息向后移动待发送指针,用来补全丢失的数据。假设上次确认后,发送数据全部丢失,此时,待发送指针移动到待确认指针位置。

ack消息无需保证高可靠传输。发送端只要收到有更大顺序号的ack出现,就可以移动已确认指针,将小于ack顺序号的缓存数据交给下游业务处理逻辑。

nack消息无需保证高可靠传输。接收端只要发现数据跳号或丢失,定时发送nack消息,直至丢失顺序号补全。

ringbuffer队列为固定大小队列,以上4个指针通过取模与ringbuffer队列对应。ringbuffer队列的位置设为index:index=mod(指针位置,队列大小)。

发送端发给接收端的每个主题数据都要求提供从0开始的顺序号。接收端通过顺序号,过滤重复数据。

接收端主节点收到主题数据后,进行四步操作:

a)判断主题数据是否重复,如果重复,忽略数据;

b)判断主题数据是否跳号,如果跳号,发送nack消息,nack消息中携带要求发送的数据主题以及顺序号;

c)完成a,b步骤后,将主题数据按顺序插入对应主题数据的数据缓冲区中;

d)完成c步骤后,为数据编制一个全局顺序号,插入全序队列。全序队列存放一个数据指针,该指针指向具体数据。

接收端选主应满足新当选的主节点必须为当前时刻接收数据量最多的节点。

根据以上设计,发送端可以通过OpenPGM或原始UDP组播等网络协议实现数据传输。

发送端和接收端的选主可以选用etcd或zookeeper实现。

根据上述技术方案,本发明可解决基于点对点的数据传输的一对多发送,定序,选主,数据补传等问题。

进一步的,对于交易系统,需要保证信息的传输的可靠性,本发明所采用的技术方案进行故障恢复的方式如下:

对于常见的故障恢复,本发明技术方案分别考虑了发送端异常和接收端异常两个场景。

1、发送端主异常

如图3所示,发送端主异常,发送端的主节点租期到期后,触发备节点选主操作。备节点通过选主算法,重新选举出主节点,开始对外发送数据。

2、接收端主异常

接收端主异常需要分四步进行恢复:

S2.1 ack消息停止:如下图4所示,Node3_1宕机,此时,ack消息无法发送。发送端即使继续发送消息,因为没有收到ack消息,无法移动已确认指针,ringbuffer队列最终被占满,发送停止。

S2.2触发选主过程:如图5所示,由于主节点有租期限制,当超过租期后,接收端备节点重新选主。假设Node3_2目前收到的数据最多,根据特定的选主算法,Node3_2当选为新的主节点。

S2.3补充丢失数据:新选举出的接收端主节点,需要向发送端发送数据重传指令,由于发送端目前的保留数据是老的主节点确认点后的数据。发送端从上次确认位置发送数据,数据是不会丢失的。发送端发送的重复数据,接收端通过顺序号过滤即可。

S2.4恢复通信:如图6所示,现存的接收端通过选主算法,可以知道现有的节点的主备关系,此时,新当选的主节点,开始向备节点同步数据。恢复通信的过程。

综上所述,本发明所采用的技术方案不仅能够稳定高效的进行数据传输,同时,在交易系统的任一节点发生故障时,均可以保证传输的数据不丢失,且传输的数据次序不会发生变化。

以上所述,仅为此发明的具体实施方式,但本发明的保护范围不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案和新型的构思加于等同替换或改变,都应涵盖在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号